From 6d75f34f60fb730491cad0193346da5bf98e1a64 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Fri, 11 May 2007 10:10:11 +0000 Subject: [PATCH] Fix for 186533, picking up indexer project preferences. --- .../cdt/internal/core/pdom/PDOMManager.java | 16 +++++--- .../core/pdom/indexer/DeltaAnalyzer.java | 15 ++----- .../core/pdom/indexer/IndexerPreferences.java | 6 +-- .../core/pdom/indexer/PDOMIndexerTask.java | 11 ++++- .../core/pdom/indexer/PDOMRebuildTask.java | 6 ++- .../core/pdom/indexer/PDOMUpdateTask.java | 1 + .../indexer/fast/PDOMFastIndexerTask.java | 41 ++++++++++++------- .../indexer/full/PDOMFullIndexerTask.java | 21 +++++++--- 8 files changed, 72 insertions(+), 45 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMManager.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMManager.java index 813335b3cae..74c271e81d2 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMManager.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMManager.java @@ -117,7 +117,9 @@ public class PDOMManager implements IWritableIndexManager, IListener { fProject= prj; } public void preferenceChange(PreferenceChangeEvent event) { - onPreferenceChange(fProject, event); + if (fProject.getProject().isOpen()) { + onPreferenceChange(fProject, event); + } } } @@ -389,9 +391,14 @@ public class PDOMManager implements IWritableIndexManager, IListener { private void changeIndexer(ICProject cproject) throws CoreException { assert !Thread.holdsLock(fProjectToPDOM); - IPDOMIndexer oldIndexer= null; - IProject prj= cproject.getProject(); + // if there is no indexer, don't touch the preferences. + IPDOMIndexer oldIndexer= getIndexer(cproject); + if (oldIndexer == null) { + return; + } + + IProject prj= cproject.getProject(); String newid= IndexerPreferences.get(prj, IndexerPreferences.KEY_INDEXER_ID, IPDOMManager.ID_NO_INDEXER); Properties props= IndexerPreferences.getProperties(prj); @@ -640,8 +647,7 @@ public class PDOMManager implements IWritableIndexManager, IListener { return; } - boolean allFiles= IndexerPreferences.getIndexAllFiles(project.getProject()); - DeltaAnalyzer deltaAnalyzer = new DeltaAnalyzer(allFiles); + DeltaAnalyzer deltaAnalyzer = new DeltaAnalyzer(); deltaAnalyzer.analyzeDelta(delta); ITranslationUnit[] added= deltaAnalyzer.getAddedTUs(); ITranslationUnit[] changed= deltaAnalyzer.getChangedTUs(); 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 e1601a2d0d5..9e6601df389 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 @@ -15,7 +15,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; -import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.ICContainer; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICElementDelta; @@ -24,13 +23,11 @@ import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.NullProgressMonitor; public class DeltaAnalyzer { - private boolean fAllFiles; private List fAdded= new ArrayList(); private List fChanged= new ArrayList(); private List fRemoved= new ArrayList(); - public DeltaAnalyzer(boolean allFiles) { - fAllFiles= allFiles; + public DeltaAnalyzer() { } public void analyzeDelta(ICElementDelta delta) throws CoreException { @@ -55,15 +52,11 @@ public class DeltaAnalyzer { switch (delta.getKind()) { case ICElementDelta.CHANGED: if ((flags & ICElementDelta.F_CONTENT) != 0) { - if (fAllFiles || !CoreModel.isScannerInformationEmpty(tu.getResource()) || tu.isHeaderUnit()) { - fChanged.add(tu); - } + fChanged.add(tu); } break; case ICElementDelta.ADDED: - if (fAllFiles || !CoreModel.isScannerInformationEmpty(tu.getResource()) || tu.isHeaderUnit()) { - fAdded.add(tu); - } + fAdded.add(tu); break; case ICElementDelta.REMOVED: fRemoved.add(tu); @@ -81,7 +74,7 @@ public class DeltaAnalyzer { } private void collectSources(ICContainer container, Collection sources) throws CoreException { - container.accept(new TranslationUnitCollector(sources, sources, fAllFiles, new NullProgressMonitor())); + container.accept(new TranslationUnitCollector(sources, sources, true, new NullProgressMonitor())); } public ITranslationUnit[] getAddedTUs() { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/IndexerPreferences.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/IndexerPreferences.java index 24efd1e4a82..fb66a132a1e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/IndexerPreferences.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/IndexerPreferences.java @@ -380,7 +380,7 @@ public class IndexerPreferences { public static int getUpdatePolicy(IProject project) { // no support for project specific policies - Preferences[] prefs= getPreferences(null); + Preferences[] prefs= getInstancePreferencesArray(); return getUpdatePolicy(prefs); } @@ -402,8 +402,4 @@ public class IndexerPreferences { } return DEFAULT_UPDATE_POLICY; } - - public static boolean getIndexAllFiles(IProject project) { - return "true".equals(IndexerPreferences.get(project.getProject(), IndexerPreferences.KEY_INDEX_ALL_FILES, null)); //$NON-NLS-1$ - } } 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 a5ae464ce7c..16f846c4801 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 @@ -71,6 +71,7 @@ public abstract class PDOMIndexerTask extends PDOMWriter implements IPDOMIndexer private String fDummyFileName; private URI fDummyFileURI; private int fUpdateFlags= IIndexManager.UPDATE_ALL; + private boolean fAllFilesProvided= true; protected PDOMIndexerTask(AbstractPDOMIndexer indexer) { fIndexer= indexer; @@ -116,6 +117,14 @@ public abstract class PDOMIndexerTask extends PDOMWriter implements IPDOMIndexer fFilesUpFront.addAll(Arrays.asList(fIndexer.getFilesToParseUpFront())); } + final public void setAllFilesProvided(boolean allFiles) { + fAllFilesProvided= allFiles; + } + + final public boolean getAllFilesProvided() { + return fAllFilesProvided; + } + /** * Checks whether a given debug option is enabled. See {@link IPDOMIndexerTask} * for valid values. @@ -128,7 +137,7 @@ public abstract class PDOMIndexerTask extends PDOMWriter implements IPDOMIndexer } /** - * Figurues out whether all files (sources without config, headers not included) + * Figures out whether all files (sources without configuration, headers not included) * should be parsed. * @since 4.0 */ diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PDOMRebuildTask.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PDOMRebuildTask.java index c0cbe77a43c..7d1db6c34b7 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PDOMRebuildTask.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PDOMRebuildTask.java @@ -101,8 +101,10 @@ public class PDOMRebuildTask implements IPDOMIndexerTask { ITranslationUnit[] tus= (ITranslationUnit[]) sources.toArray(new ITranslationUnit[sources.size()]); fDelegate= fIndexer.createTask(tus, NO_TUS, NO_TUS); if (fDelegate instanceof PDOMIndexerTask) { - ((PDOMIndexerTask) fDelegate).setUpateFlags(IIndexManager.UPDATE_ALL); - ((PDOMIndexerTask) fDelegate).setParseUpFront(); + final PDOMIndexerTask delegate = (PDOMIndexerTask) fDelegate; + delegate.setUpateFlags(IIndexManager.UPDATE_ALL); + delegate.setParseUpFront(); + delegate.setAllFilesProvided(allFiles); } } 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 bc63e88f7d7..bec431a6c0c 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 @@ -92,6 +92,7 @@ public class PDOMUpdateTask implements IPDOMIndexerTask { if (fDelegate instanceof PDOMIndexerTask) { final PDOMIndexerTask task = (PDOMIndexerTask) fDelegate; task.setUpateFlags(fUpdateOptions); + task.setAllFilesProvided(allFiles); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/fast/PDOMFastIndexerTask.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/fast/PDOMFastIndexerTask.java index 0b6827d76fc..17647cf4cb8 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/fast/PDOMFastIndexerTask.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/fast/PDOMFastIndexerTask.java @@ -14,8 +14,10 @@ package org.eclipse.cdt.internal.core.pdom.indexer.fast; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.HashMap; import java.util.Iterator; +import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -25,6 +27,7 @@ import org.eclipse.cdt.core.index.IIndexFile; import org.eclipse.cdt.core.index.IIndexFileLocation; import org.eclipse.cdt.core.index.IndexLocationFactory; import org.eclipse.cdt.core.model.AbstractLanguage; +import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.parser.CodeReader; import org.eclipse.cdt.core.parser.IScannerInfo; @@ -39,7 +42,7 @@ import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; class PDOMFastIndexerTask extends PDOMIndexerTask implements CallbackHandler { - private List fChanged = new ArrayList(); + private List fChanged = new LinkedList(); private List fRemoved = new ArrayList(); private IWritableIndex fIndex; private IndexBasedCodeReaderFactory fCodeReaderFactory; @@ -58,10 +61,29 @@ class PDOMFastIndexerTask extends PDOMIndexerTask implements CallbackHandler { public void run(IProgressMonitor monitor) { long start = System.currentTimeMillis(); try { + // separate headers remove files that have no scanner configuration + final boolean filterFiles= !getIndexAllFiles() && getAllFilesProvided(); + List headers= new ArrayList(); + List sources= fChanged; + for (Iterator iter = fChanged.iterator(); iter.hasNext();) { + ITranslationUnit tu = (ITranslationUnit) iter.next(); + if (tu.isSourceUnit()) { + if (filterFiles && CoreModel.isScannerInformationEmpty(tu.getResource())) { + iter.remove(); + updateInfo(0, 0, -1); + } + } + else { + headers.add(tu); + iter.remove(); + } + } + setupIndexAndReaderFactory(); fIndex.acquireReadLock(); try { - registerTUsInReaderFactory(); + registerTUsInReaderFactory(sources); + registerTUsInReaderFactory(headers); Iterator i= fRemoved.iterator(); while (i.hasNext()) { @@ -77,17 +99,6 @@ class PDOMFastIndexerTask extends PDOMIndexerTask implements CallbackHandler { } } - // separate headers - List headers= new ArrayList(); - List sources= fChanged; - for (Iterator iter = fChanged.iterator(); iter.hasNext();) { - ITranslationUnit tu = (ITranslationUnit) iter.next(); - if (!tu.isSourceUnit()) { - headers.add(tu); - iter.remove(); - } - } - parseTUs(fIndex, 1, sources, headers, monitor); if (monitor.isCanceled()) { return; @@ -111,9 +122,9 @@ class PDOMFastIndexerTask extends PDOMIndexerTask implements CallbackHandler { fCodeReaderFactory.setCallbackHandler(this); } - private void registerTUsInReaderFactory() throws CoreException { + private void registerTUsInReaderFactory(Collection tus) throws CoreException { int removed= 0; - for (Iterator iter = fChanged.iterator(); iter.hasNext();) { + for (Iterator iter = tus.iterator(); iter.hasNext();) { ITranslationUnit tu = (ITranslationUnit) iter.next(); IIndexFileLocation ifl = IndexLocationFactory.getIFL(tu); IndexFileInfo info= fCodeReaderFactory.createFileInfo(ifl); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/full/PDOMFullIndexerTask.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/full/PDOMFullIndexerTask.java index bc19460b6ae..e53c97e2d0c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/full/PDOMFullIndexerTask.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/full/PDOMFullIndexerTask.java @@ -26,6 +26,7 @@ import org.eclipse.cdt.core.index.IIndexFile; import org.eclipse.cdt.core.index.IIndexFileLocation; import org.eclipse.cdt.core.index.IndexLocationFactory; import org.eclipse.cdt.core.model.AbstractLanguage; +import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.parser.CodeReader; import org.eclipse.cdt.core.parser.IScannerInfo; @@ -65,20 +66,28 @@ class PDOMFullIndexerTask extends PDOMIndexerTask { public void run(IProgressMonitor monitor) { long start = System.currentTimeMillis(); try { - setupIndex(); - registerTUsInReaderFactory(fChanged); - - // separate headers + // separate headers remove files that have no scanner configuration + final boolean filterFiles= !getIndexAllFiles() && getAllFilesProvided(); List headers= new ArrayList(); List sources= fChanged; for (Iterator iter = fChanged.iterator(); iter.hasNext();) { ITranslationUnit tu = (ITranslationUnit) iter.next(); - if (!tu.isSourceUnit()) { + if (tu.isSourceUnit()) { + if (filterFiles && CoreModel.isScannerInformationEmpty(tu.getResource())) { + iter.remove(); + updateInfo(0, 0, -1); + } + } + else { headers.add(tu); iter.remove(); } } - + + setupIndex(); + registerTUsInReaderFactory(sources); + registerTUsInReaderFactory(headers); + Iterator i= fRemoved.iterator(); while (i.hasNext()) { if (monitor.isCanceled())