Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarkus Schorn2011-09-21 15:35:44 +0000
committerMarkus Schorn2011-09-22 13:44:38 +0000
commit51d0857bd2e5c734449b1438127beffe5485bde6 (patch)
tree1fd6cd7c4fa4d4d3ce9bb4198b2fc107a204e87a
parentbaacf46add1ac5c8db7a367ea6151719fc320f48 (diff)
downloadorg.eclipse.cdt-51d0857bd2e5c734449b1438127beffe5485bde6.tar.gz
org.eclipse.cdt-51d0857bd2e5c734449b1438127beffe5485bde6.tar.xz
org.eclipse.cdt-51d0857bd2e5c734449b1438127beffe5485bde6.zip
Make rebuild index deterministic.
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PDOMIndexerTask.java45
1 files changed, 34 insertions, 11 deletions
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 66844f2ad24..9fba3a7cd2c 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
@@ -11,12 +11,12 @@
*******************************************************************************/
package org.eclipse.cdt.internal.core.pdom.indexer;
+import java.util.Arrays;
import java.util.Calendar;
-import java.util.LinkedHashSet;
+import java.util.Comparator;
+import java.util.HashSet;
import java.util.Map;
-import com.ibm.icu.text.NumberFormat;
-
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.dom.IPDOMIndexer;
@@ -38,6 +38,7 @@ import org.eclipse.cdt.internal.core.pdom.IndexerProgress;
import org.eclipse.cdt.internal.core.pdom.db.ChunkCache;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
@@ -47,6 +48,8 @@ import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.osgi.util.NLS;
+import com.ibm.icu.text.NumberFormat;
+
/**
* Configures the abstract indexer task suitable for indexing projects.
*/
@@ -104,14 +107,34 @@ public abstract class PDOMIndexerTask extends AbstractIndexerTask implements IPD
}
private static ITranslationUnit[] concat(ITranslationUnit[] added, ITranslationUnit[] changed) {
- LinkedHashSet<ITranslationUnit> union = new LinkedHashSet<ITranslationUnit>(added.length + changed.length);
- for (ITranslationUnit tu : added) {
- union.add(tu);
- }
- for (ITranslationUnit tu : changed) {
- union.add(tu);
- }
- return union.toArray(new ITranslationUnit[union.size()]);
+ HashSet<ITranslationUnit> union = new HashSet<ITranslationUnit>(added.length + changed.length);
+ union.addAll(Arrays.asList(added));
+ union.addAll(Arrays.asList(changed));
+ final ITranslationUnit[] result = union.toArray(new ITranslationUnit[union.size()]);
+ Arrays.sort(result, new Comparator<ITranslationUnit>() {
+ public int compare(ITranslationUnit o1, ITranslationUnit o2) {
+ IResource res1= o1.getResource();
+ IResource res2= o2.getResource();
+ if (res1 != null && res2 != null) {
+ return compare(res1.getFullPath().segments(), res2.getFullPath().segments());
+ }
+ return res1 != null ? -1 : res2 != null ? 1 : 0;
+ }
+
+ private int compare(String[] s1, String[] s2) {
+ int max= Math.min(s1.length, s2.length) - 1;
+ for (int i = 0; i < max; i++) {
+ int cmp= s1[i].compareTo(s2[i]);
+ if (cmp != 0)
+ return cmp;
+ }
+ int cmp = s1.length-s2.length;
+ if (cmp != 0)
+ return cmp;
+ return s1[max].compareTo(s2[max]);
+ }
+ });
+ return result;
}
public final void setParseUpFront() {

Back to the top