mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
2004-09-01 Chris Wiebe
avoid unnecessary deltas * browser/org/eclipse/cdt/internal/core/browser/cache/TypeCacheManager.java
This commit is contained in:
parent
188ffdc83f
commit
acc7f9cd6a
2 changed files with 42 additions and 20 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
2004-09-01 Chris Wiebe
|
||||||
|
|
||||||
|
avoid unnecessary deltas
|
||||||
|
* browser/org/eclipse/cdt/internal/core/browser/cache/TypeCacheManager.java
|
||||||
|
|
||||||
2004-08-31 Chris Wiebe
|
2004-08-31 Chris Wiebe
|
||||||
|
|
||||||
Fix for 68883
|
Fix for 68883
|
||||||
|
|
|
@ -29,6 +29,7 @@ import org.eclipse.cdt.core.model.ICElement;
|
||||||
import org.eclipse.cdt.core.model.ICElementDelta;
|
import org.eclipse.cdt.core.model.ICElementDelta;
|
||||||
import org.eclipse.cdt.core.model.ICProject;
|
import org.eclipse.cdt.core.model.ICProject;
|
||||||
import org.eclipse.cdt.core.model.ITranslationUnit;
|
import org.eclipse.cdt.core.model.ITranslationUnit;
|
||||||
|
import org.eclipse.core.internal.runtime.Assert;
|
||||||
import org.eclipse.core.resources.IProject;
|
import org.eclipse.core.resources.IProject;
|
||||||
import org.eclipse.core.runtime.IProgressMonitor;
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
import org.eclipse.core.runtime.ISafeRunnable;
|
import org.eclipse.core.runtime.ISafeRunnable;
|
||||||
|
@ -63,22 +64,36 @@ public class TypeCacheManager implements ITypeCacheChangedListener {
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized void updateProject(IProject project) {
|
public synchronized void updateProject(IProject project) {
|
||||||
|
// TODO finer-grained flush needed, for now just flush the whole map
|
||||||
|
fTypeToElementMap.clear();
|
||||||
|
fElementToTypeMap.clear();
|
||||||
addCacheDelta(project, null);
|
addCacheDelta(project, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public synchronized void processElementChanged(ElementChangedEvent event, boolean enableIndexing) {
|
||||||
|
int deltaCount = processDelta(event.getDelta());
|
||||||
|
if (deltaCount > 0) {
|
||||||
|
// TODO finer-grained flush needed, for now just flush the whole map
|
||||||
|
fTypeToElementMap.clear();
|
||||||
|
fElementToTypeMap.clear();
|
||||||
|
reconcile(enableIndexing, Job.BUILD, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static final int PATH_ENTRY_FLAGS = ICElementDelta.F_ADDED_PATHENTRY_SOURCE
|
private static final int PATH_ENTRY_FLAGS = ICElementDelta.F_ADDED_PATHENTRY_SOURCE
|
||||||
| ICElementDelta.F_REMOVED_PATHENTRY_SOURCE
|
| ICElementDelta.F_REMOVED_PATHENTRY_SOURCE
|
||||||
| ICElementDelta.F_CHANGED_PATHENTRY_INCLUDE
|
| ICElementDelta.F_CHANGED_PATHENTRY_INCLUDE
|
||||||
| ICElementDelta.F_CHANGED_PATHENTRY_MACRO
|
| ICElementDelta.F_CHANGED_PATHENTRY_MACRO
|
||||||
| ICElementDelta.F_PATHENTRY_REORDER;
|
| ICElementDelta.F_PATHENTRY_REORDER;
|
||||||
|
|
||||||
public synchronized void processDelta(ICElementDelta delta) {
|
private int processDelta(ICElementDelta delta) {
|
||||||
ICElement elem = delta.getElement();
|
ICElement elem = delta.getElement();
|
||||||
boolean added = (delta.getKind() == ICElementDelta.ADDED);
|
boolean added = (delta.getKind() == ICElementDelta.ADDED);
|
||||||
boolean removed = (delta.getKind() == ICElementDelta.REMOVED);
|
boolean removed = (delta.getKind() == ICElementDelta.REMOVED);
|
||||||
boolean contentChanged = ((delta.getFlags() & ICElementDelta.F_CONTENT) != 0);
|
boolean contentChanged = ((delta.getFlags() & ICElementDelta.F_CONTENT) != 0);
|
||||||
boolean pathEntryChanged = ((delta.getFlags() & PATH_ENTRY_FLAGS) != 0);
|
boolean pathEntryChanged = ((delta.getFlags() & PATH_ENTRY_FLAGS) != 0);
|
||||||
boolean hasChildren = ((delta.getFlags() & ICElementDelta.F_CHILDREN) != 0);
|
boolean hasChildren = ((delta.getFlags() & ICElementDelta.F_CHILDREN) != 0);
|
||||||
|
int deltaCount = 0;
|
||||||
|
|
||||||
switch (elem.getElementType()) {
|
switch (elem.getElementType()) {
|
||||||
case ICElement.C_PROJECT:
|
case ICElement.C_PROJECT:
|
||||||
|
@ -87,6 +102,7 @@ public class TypeCacheManager implements ITypeCacheChangedListener {
|
||||||
IProject project = cProject.getProject();
|
IProject project = cProject.getProject();
|
||||||
if (added || removed || pathEntryChanged) {
|
if (added || removed || pathEntryChanged) {
|
||||||
addCacheDelta(project, delta);
|
addCacheDelta(project, delta);
|
||||||
|
++deltaCount;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -96,11 +112,12 @@ public class TypeCacheManager implements ITypeCacheChangedListener {
|
||||||
IProject project = cProject.getProject();
|
IProject project = cProject.getProject();
|
||||||
ITranslationUnit unit = (ITranslationUnit) elem;
|
ITranslationUnit unit = (ITranslationUnit) elem;
|
||||||
if (unit.isWorkingCopy()) {
|
if (unit.isWorkingCopy()) {
|
||||||
processWorkingCopyDelta(delta);
|
deltaCount += processWorkingCopyDelta(delta);
|
||||||
return;
|
return deltaCount;
|
||||||
} else {
|
} else {
|
||||||
if (added || removed || pathEntryChanged || contentChanged) {
|
if (added || removed || pathEntryChanged || contentChanged) {
|
||||||
addCacheDelta(project, delta);
|
addCacheDelta(project, delta);
|
||||||
|
++deltaCount;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -119,6 +136,7 @@ public class TypeCacheManager implements ITypeCacheChangedListener {
|
||||||
IProject project = cProject.getProject();
|
IProject project = cProject.getProject();
|
||||||
if (added || removed) {
|
if (added || removed) {
|
||||||
addCacheDelta(project, delta);
|
addCacheDelta(project, delta);
|
||||||
|
++deltaCount;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -128,10 +146,12 @@ public class TypeCacheManager implements ITypeCacheChangedListener {
|
||||||
ICElementDelta[] children = delta.getAffectedChildren();
|
ICElementDelta[] children = delta.getAffectedChildren();
|
||||||
if (children != null) {
|
if (children != null) {
|
||||||
for (int i = 0; i < children.length; ++i) {
|
for (int i = 0; i < children.length; ++i) {
|
||||||
processDelta(children[i]);
|
deltaCount += processDelta(children[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return deltaCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addCacheDelta(IProject project, ICElementDelta delta) {
|
private void addCacheDelta(IProject project, ICElementDelta delta) {
|
||||||
|
@ -140,14 +160,11 @@ public class TypeCacheManager implements ITypeCacheChangedListener {
|
||||||
} else {
|
} else {
|
||||||
getCache(project).addDelta(new TypeCacheDelta(project, delta));
|
getCache(project).addDelta(new TypeCacheDelta(project, delta));
|
||||||
}
|
}
|
||||||
// TODO finer-grained flush needed, for now just flush the whole map
|
|
||||||
fTypeToElementMap.clear();
|
|
||||||
fElementToTypeMap.clear();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized void processWorkingCopyDelta(ICElementDelta delta) {
|
private int processWorkingCopyDelta(ICElementDelta delta) {
|
||||||
// ignore workies copies for now
|
// ignore workies copies for now
|
||||||
return;
|
return 0;
|
||||||
/* ICElement elem = delta.getElement();
|
/* ICElement elem = delta.getElement();
|
||||||
boolean added = (delta.getKind() == ICElementDelta.ADDED);
|
boolean added = (delta.getKind() == ICElementDelta.ADDED);
|
||||||
boolean removed = (delta.getKind() == ICElementDelta.REMOVED);
|
boolean removed = (delta.getKind() == ICElementDelta.REMOVED);
|
||||||
|
@ -197,6 +214,7 @@ public class TypeCacheManager implements ITypeCacheChangedListener {
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized ITypeCache getCache(IProject project) {
|
public synchronized ITypeCache getCache(IProject project) {
|
||||||
|
Assert.isNotNull(project);
|
||||||
synchronized(fCacheMap) {
|
synchronized(fCacheMap) {
|
||||||
ITypeCache cache = (ITypeCache) fCacheMap.get(project);
|
ITypeCache cache = (ITypeCache) fCacheMap.get(project);
|
||||||
if (cache == null) {
|
if (cache == null) {
|
||||||
|
@ -305,11 +323,6 @@ public class TypeCacheManager implements ITypeCacheChangedListener {
|
||||||
return location;
|
return location;
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized void processElementChanged(ElementChangedEvent event, boolean enableIndexing) {
|
|
||||||
processDelta(event.getDelta());
|
|
||||||
reconcile(enableIndexing, Job.BUILD, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addTypeCacheChangedListener(ITypeCacheChangedListener listener) {
|
public void addTypeCacheChangedListener(ITypeCacheChangedListener listener) {
|
||||||
// add listener only if it is not already present
|
// add listener only if it is not already present
|
||||||
synchronized(fChangeListeners) {
|
synchronized(fChangeListeners) {
|
||||||
|
@ -349,9 +362,11 @@ public class TypeCacheManager implements ITypeCacheChangedListener {
|
||||||
}
|
}
|
||||||
|
|
||||||
public ITypeInfo getTypeForElement(ICElement element, boolean forceUpdate, boolean forceResolve, boolean enableIndexing, IProgressMonitor monitor) {
|
public ITypeInfo getTypeForElement(ICElement element, boolean forceUpdate, boolean forceResolve, boolean enableIndexing, IProgressMonitor monitor) {
|
||||||
|
if (element.exists()) {
|
||||||
ITypeInfo cachedInfo = (ITypeInfo) fElementToTypeMap.get(element);
|
ITypeInfo cachedInfo = (ITypeInfo) fElementToTypeMap.get(element);
|
||||||
if (cachedInfo != null && cachedInfo.exists())
|
if (cachedInfo != null && cachedInfo.exists())
|
||||||
return cachedInfo;
|
return cachedInfo;
|
||||||
|
}
|
||||||
|
|
||||||
IQualifiedTypeName qualifiedName = TypeUtil.getFullyQualifiedName(element);
|
IQualifiedTypeName qualifiedName = TypeUtil.getFullyQualifiedName(element);
|
||||||
if (qualifiedName != null) {
|
if (qualifiedName != null) {
|
||||||
|
@ -383,9 +398,11 @@ public class TypeCacheManager implements ITypeCacheChangedListener {
|
||||||
}
|
}
|
||||||
|
|
||||||
public ICElement getElementForType(ITypeInfo type, boolean forceUpdate, boolean forceResolve, boolean enableIndexing, IProgressMonitor monitor) {
|
public ICElement getElementForType(ITypeInfo type, boolean forceUpdate, boolean forceResolve, boolean enableIndexing, IProgressMonitor monitor) {
|
||||||
|
if (type.exists()) {
|
||||||
ICElement cachedElem = (ICElement) fTypeToElementMap.get(type);
|
ICElement cachedElem = (ICElement) fTypeToElementMap.get(type);
|
||||||
if (cachedElem != null && cachedElem.exists())
|
if (cachedElem != null && cachedElem.exists())
|
||||||
return cachedElem;
|
return cachedElem;
|
||||||
|
}
|
||||||
|
|
||||||
IProject project = type.getEnclosingProject();
|
IProject project = type.getEnclosingProject();
|
||||||
ITypeCache cache = getCache(project);
|
ITypeCache cache = getCache(project);
|
||||||
|
|
Loading…
Add table
Reference in a new issue