From 61c06f6e88d2640bd72ca5d7a4a5ed0fe69ffda4 Mon Sep 17 00:00:00 2001 From: Anton Leherbauer Date: Tue, 11 Sep 2007 11:38:13 +0000 Subject: [PATCH] Fix for 202085: CDT contributions to ProjectExplorer slows performance down dramatically --- .../internal/core/model/DeltaProcessor.java | 10 ++-- .../cdt/ui/CElementContentProvider.java | 48 +++++++++++-------- 2 files changed, 34 insertions(+), 24 deletions(-) diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/DeltaProcessor.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/DeltaProcessor.java index 0b37e21c932..aba3921f727 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/DeltaProcessor.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/DeltaProcessor.java @@ -458,7 +458,11 @@ public class DeltaProcessor { IResource resource = delta.getResource(); ICElement current = createElement(resource); updateChildren = updateCurrentDeltaAndIndex(current, delta); - if (current == null || current instanceof ISourceRoot) { + if (current == null) { + nonCResourcesChanged(parent, delta); + // no corresponding ICElement - we are done + return; + } else if (current instanceof ISourceRoot) { nonCResourcesChanged(parent, delta); } else if (current instanceof ICProject) { ICProject cprj = (ICProject)current; @@ -467,9 +471,7 @@ public class DeltaProcessor { nonCResourcesChanged(parent, delta); } } - if (current != null) { - parent = current; - } + parent = current; } catch (CModelException e) { } if (updateChildren){ diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CElementContentProvider.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CElementContentProvider.java index beb30f5257e..77736921c88 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CElementContentProvider.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CElementContentProvider.java @@ -15,23 +15,6 @@ package org.eclipse.cdt.ui; import java.util.HashSet; -import org.eclipse.cdt.core.model.CModelException; -import org.eclipse.cdt.core.model.CoreModel; -import org.eclipse.cdt.core.model.ElementChangedEvent; -import org.eclipse.cdt.core.model.IArchive; -import org.eclipse.cdt.core.model.IBinary; -import org.eclipse.cdt.core.model.ICElement; -import org.eclipse.cdt.core.model.ICElementDelta; -import org.eclipse.cdt.core.model.ICProject; -import org.eclipse.cdt.core.model.IElementChangedListener; -import org.eclipse.cdt.core.model.IParent; -import org.eclipse.cdt.core.model.ITranslationUnit; -import org.eclipse.cdt.core.model.IWorkingCopy; -import org.eclipse.cdt.internal.core.model.ArchiveContainer; -import org.eclipse.cdt.internal.core.model.BinaryContainer; -import org.eclipse.cdt.internal.ui.BaseCElementContentProvider; -import org.eclipse.cdt.internal.ui.actions.SelectionConverter; -import org.eclipse.cdt.internal.ui.text.CWordFinder; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.jface.text.IRegion; @@ -45,6 +28,27 @@ import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.widgets.Control; import org.eclipse.ui.texteditor.ITextEditor; +import org.eclipse.cdt.core.model.CModelException; +import org.eclipse.cdt.core.model.CoreModel; +import org.eclipse.cdt.core.model.ElementChangedEvent; +import org.eclipse.cdt.core.model.IArchive; +import org.eclipse.cdt.core.model.IBinary; +import org.eclipse.cdt.core.model.ICElement; +import org.eclipse.cdt.core.model.ICElementDelta; +import org.eclipse.cdt.core.model.ICModel; +import org.eclipse.cdt.core.model.ICProject; +import org.eclipse.cdt.core.model.IElementChangedListener; +import org.eclipse.cdt.core.model.IParent; +import org.eclipse.cdt.core.model.ITranslationUnit; +import org.eclipse.cdt.core.model.IWorkingCopy; + +import org.eclipse.cdt.internal.core.model.ArchiveContainer; +import org.eclipse.cdt.internal.core.model.BinaryContainer; + +import org.eclipse.cdt.internal.ui.BaseCElementContentProvider; +import org.eclipse.cdt.internal.ui.actions.SelectionConverter; +import org.eclipse.cdt.internal.ui.text.CWordFinder; + /** * A content provider for C elements. *

@@ -169,8 +173,10 @@ public class CElementContentProvider extends BaseCElementContentProvider impleme // well, we do see bugzilla 147694 if (element instanceof ITranslationUnit) { ITranslationUnit unit = (ITranslationUnit) element; - if (!getProvideWorkingCopy() && unit.isWorkingCopy()) { - return; + if (unit.isWorkingCopy()) { + if (!getProvideWorkingCopy() || kind == ICElementDelta.REMOVED || kind == ICElementDelta.ADDED) { + return; + } } if (!getProvideMembers() && kind == ICElementDelta.CHANGED) { return; @@ -230,8 +236,10 @@ public class CElementContentProvider extends BaseCElementContentProvider impleme if (deltas == null) return false; - if (deltas.length > 1) { + if (deltas.length > 1 && !(parent instanceof ICModel)) { // more than one child changed, refresh from here downwards + // but not if the parent is ICModel + // see https://bugs.eclipse.org/bugs/show_bug.cgi?id=202085 postRefresh(parent); return true; }