From 6e5fa262c6c521634064c9fa8e2404aa50b0bc93 Mon Sep 17 00:00:00 2001 From: Alain Magloire Date: Sat, 3 Apr 2004 17:32:56 +0000 Subject: [PATCH] Fix for PR 57287 --- core/org.eclipse.cdt.core/ChangeLog | 10 ++ .../internal/core/model/CModelManager.java | 1 + .../internal/core/model/DeltaProcessor.java | 97 ++++++++++--------- .../internal/core/model/PathEntryManager.java | 7 ++ .../cdt/utils/coff/parser/PEBinaryObject.java | 2 +- 5 files changed, 69 insertions(+), 48 deletions(-) diff --git a/core/org.eclipse.cdt.core/ChangeLog b/core/org.eclipse.cdt.core/ChangeLog index ad96bc7cdd8..95f055b746f 100644 --- a/core/org.eclipse.cdt.core/ChangeLog +++ b/core/org.eclipse.cdt.core/ChangeLog @@ -1,3 +1,13 @@ +2004-04-03 Alain Magloire + + Fix for PR 57287 + + * model/org/eclipse/cdt/internal/core/model/CModelManager.java + * model/org/eclipse/cdt/internal/core/model/DeltaProcessor.java + * model/org/eclipse/cdt/internal/core/model/PathEntryManager.java + + * model/org/eclipse/cdt/internal/core/model/PEBinaryObject.java + 2004-04-02 Alain Magloire Use the the Job manager for the binary runner. diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelManager.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelManager.java index b465de0f52c..ddc87b54bc0 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelManager.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelManager.java @@ -412,6 +412,7 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe if (pinfo.vLib != null) { releaseCElement(pinfo.vLib); } + pinfo.resetCaches(); IProject project = celement.getCProject().getProject(); removeBinaryRunner(project); } 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 8ff7f6f0bdf..18acc967653 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 @@ -11,13 +11,13 @@ import org.eclipse.cdt.core.model.IArchiveContainer; import org.eclipse.cdt.core.model.IBinaryContainer; 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.internal.core.search.indexing.IndexManager; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceDelta; +import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.runtime.IPath; /** @@ -55,12 +55,40 @@ public class DeltaProcessor { if (resource == null) { return null; } + CModelManager manager = CModelManager.getDefault(); + + boolean shouldProcess = true; + + // Check for C nature or if the was a CNature + if (!(resource instanceof IWorkspaceRoot)) { + IProject project = resource.getProject(); + if (!(manager.hasCNature(project) || manager.hasCCNature(project))) { + shouldProcess = false; + CModel root = manager.getCModel(); + CModelInfo rootInfo = (CModelInfo)manager.peekAtInfo(root); + if (rootInfo != null) { + ICElement[] celements = rootInfo.getChildren(); + for (int i = 0; i < celements.length; i++) { + IResource r = celements[i].getResource(); + if (project.equals(r)) { + shouldProcess = true; + } + } + } + } + } + + if (!shouldProcess) { + return null; + } + ICElement celement = manager.create(resource, null); // BUG 36424: // The Binary may only be visible in the BinaryContainers - if (celement == null) { + + if (celement == null && resource.getType() == IResource.FILE) { ICElement[] children; ICProject cproj = manager.create(resource.getProject()); if (cproj != null && cproj.isOpen()) { @@ -79,7 +107,7 @@ public class DeltaProcessor { } // BUG 36424: // The Archive may only be visible in the ArchiveContainers - if (celement == null) { + if (celement == null && resource.getType() == IResource.FILE) { ICElement[] children; ICProject cproj = manager.create(resource.getProject()); if (cproj != null && cproj.isOpen()) { @@ -109,8 +137,7 @@ public class DeltaProcessor { } /** - * Release the Element from the CModel hastable. - * Returns null if none was found. + * Release the Element and cleaning. */ protected void releaseCElement(ICElement celement) { CModelManager.getDefault().releaseCElement(celement); @@ -143,8 +170,9 @@ public class DeltaProcessor { } if ((delta.getFlags() & IResourceDelta.MOVED_FROM) != 0) { //ICElement movedFromElement = createElement(delta.getMovedFromPath()); - if (movedFromElement == null) + if (movedFromElement == null) { movedFromElement = createElement(delta.getMovedFromPath()); + } fCurrentDelta.movedTo(element, movedFromElement); movedFromElement = null; } else { @@ -306,33 +334,7 @@ public class DeltaProcessor { public ICElementDelta[] processResourceDelta(IResourceDelta changes) { try { - ICElement root = (ICModel)CModelManager.getDefault().getCModel(); - -/* - try { - changes.accept(new IResourceDeltaVisitor() { - public boolean visit(IResourceDelta delta) { - switch (delta.getKind()) { - case IResourceDelta.ADDED : - // handle added resource - System.out.print("ADDED "); - break; - case IResourceDelta.REMOVED : - // handle removed resource - System.out.print("REMOVED "); - break; - case IResourceDelta.CHANGED : - // handle changed resource - System.out.print("CHANGED "); - break; - } - System.out.println(delta.getResource()); - return true; - } - }); - } catch (CoreException e) { - } -*/ + ICElement root = CModelManager.getDefault().getCModel(); // get the workspace delta, and start processing there. IResourceDelta[] deltas = changes.getAffectedChildren(); ICElementDelta[] translatedDeltas = new CElementDelta[deltas.length]; @@ -377,6 +379,21 @@ public class DeltaProcessor { * @param delta */ protected void nonCResourcesChanged(ICElement parent, IResourceDelta delta) { + if (parent instanceof Openable && ((Openable)parent).isOpen()) { + CElementInfo info = ((Openable)parent).getElementInfo(); + switch (parent.getElementType()) { + case ICElement.C_MODEL: + ((CModelInfo)info).setNonCResources(null); + fCurrentDelta.addResourceDelta(delta); + return; + case ICElement.C_PROJECT: + ((CProjectInfo)info).setNonCResources(null); + break; + case ICElement.C_CCONTAINER: + ((CContainerInfo)info).setNonCResources(null); + break; + } + } CElementDelta elementDelta = fCurrentDelta.find(parent); if (elementDelta == null) { fCurrentDelta.changed(parent, ICElementDelta.F_CONTENT); @@ -387,20 +404,6 @@ public class DeltaProcessor { } else { elementDelta.addResourceDelta(delta); } - if (parent instanceof Openable && ((Openable)parent).isOpen()) { - CElementInfo info = ((Openable)parent).getElementInfo(); - switch (parent.getElementType()) { - case ICElement.C_MODEL: - ((CModelInfo)info).setNonCResources(null); - break; - case ICElement.C_PROJECT: - ((CProjectInfo)info).setNonCResources(null); - break; - case ICElement.C_CCONTAINER: - ((CContainerInfo)info).setNonCResources(null); - break; - } - } } /* diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/PathEntryManager.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/PathEntryManager.java index f0ecc6d228d..e285edeb562 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/PathEntryManager.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/PathEntryManager.java @@ -84,6 +84,9 @@ public class PathEntryManager implements ICDescriptorListener { * pathentry containers pool */ public static HashMap Containers = new HashMap(5); + + static final IPathEntry[] NO_PATHENTRIES = new IPathEntry[0]; + HashMap resolvedMap = new HashMap(); private static PathEntryManager pathEntryManager; @@ -145,6 +148,10 @@ public class PathEntryManager implements ICDescriptorListener { } public IPathEntry[] getRawPathEntries(ICProject cproject) throws CModelException { + CModelManager factory = CModelManager.getDefault(); + if (!(factory.hasCNature(cproject.getProject()) || factory.hasCCNature(cproject.getProject()))) { + return NO_PATHENTRIES; + } ArrayList pathEntries = new ArrayList(); try { ICDescriptor cdesc = CCorePlugin.getDefault().getCProjectDescription(cproject.getProject()); diff --git a/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/coff/parser/PEBinaryObject.java b/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/coff/parser/PEBinaryObject.java index b9fd47a2c97..78a5feeaf1b 100644 --- a/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/coff/parser/PEBinaryObject.java +++ b/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/coff/parser/PEBinaryObject.java @@ -43,7 +43,7 @@ public class PEBinaryObject extends BinaryObjectAdapter { * @see org.eclipse.cdt.core.model.IBinaryParser.IBinaryFile#getType() */ public int getType() { - return IBinaryFile.CORE; + return IBinaryFile.OBJECT; } /**