diff --git a/core/org.eclipse.cdt.core/ChangeLog b/core/org.eclipse.cdt.core/ChangeLog index 56c4b320c85..b838cef8c0c 100644 --- a/core/org.eclipse.cdt.core/ChangeLog +++ b/core/org.eclipse.cdt.core/ChangeLog @@ -1,3 +1,11 @@ +2004-04-19 Alain Magloire + + Fix for PR 59098 + + * model/org/eclipse/cdt/internal/core/model/CModel.java + * model/org/eclipse/cdt/internal/core/model/CProjectInfo.java + * model/org/eclipse/cdt/internal/core/model/DeltaProcessor.java + 2004-04-19 Alain Magloire It has become necessary to add exception in the interface diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModel.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModel.java index db07e80a876..13831906e66 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModel.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModel.java @@ -74,6 +74,25 @@ public class CModel extends Openable implements ICModel { } } + /** + * Finds the given project in the list of the java model's children. + * Returns null if not found. + */ + public ICProject findCProject(IProject project) { + try { + ICProject[] projects = getOldCProjectsList(); + for (int i = 0, length = projects.length; i < length; i++) { + ICProject javaProject = projects[i]; + if (project.equals(javaProject.getProject())) { + return javaProject; + } + } + } catch (CModelException e) { + // c model doesn't exist: cannot find any project + } + return null; + } + public IWorkspace getWorkspace() { return getUnderlyingResource().getWorkspace(); } @@ -141,6 +160,18 @@ public class CModel extends Openable implements ICModel { return resource.hashCode(); } + /** + * Workaround for bug 15168 circular errors not reported + * Returns the list of java projects before resource delta processing + * has started. + */ + public ICProject[] getOldCProjectsList() throws CModelException { + CModelManager manager = CModelManager.getDefault(); + return manager.cProjectsCache == null ? + getCProjects() : + manager.cProjectsCache; + } + /* (non-Javadoc) * @see org.eclipse.cdt.internal.core.model.Openable#generateInfos(org.eclipse.cdt.internal.core.model.OpenableInfo, org.eclipse.core.runtime.IProgressMonitor, java.util.Map, org.eclipse.core.resources.IResource) */ diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CProjectInfo.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CProjectInfo.java index 39e2daede98..e56bfc0a119 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CProjectInfo.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CProjectInfo.java @@ -18,7 +18,6 @@ import org.eclipse.cdt.core.model.ISourceRoot; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IPath; /** * Info for ICProject. @@ -64,9 +63,7 @@ class CProjectInfo extends OpenableInfo { if (nonCResources != null) return nonCResources; - CProject cproject = (CProject)getElement(); // determine if src == project - IPath projectPath = res.getProject().getFullPath(); ISourceRoot root = null; ICElement[] elements = getChildren(); for (int i = 0; i < elements.length; i++) { @@ -80,7 +77,6 @@ class CProjectInfo extends OpenableInfo { } ArrayList notChildren = new ArrayList(); - ICElement parent = getElement(); try { IResource[] resources = null; if (res instanceof IContainer) { @@ -89,7 +85,6 @@ class CProjectInfo extends OpenableInfo { } if (resources != null) { - CModelManager factory = CModelManager.getDefault(); ICElement[] children; if (root == null) { children = getChildren(); 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 36002542050..82a0816d087 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 @@ -525,8 +525,22 @@ public class DeltaProcessor { } } if ((flags & IResourceDelta.DESCRIPTION) != 0) { - if (element != null) { - elementAdded(element, delta); + IProject res = (IProject)delta.getResource(); + CModel cModel = CModelManager.getDefault().getCModel(); + boolean wasCProject = cModel.findCProject(res) != null; + boolean isCProject = CProject.hasCNature(res); + if (wasCProject != isCProject) { + // project's nature has been added or removed + if (element != null) { + // note its resources are still visible as roots to other projects + if (isCProject) { + elementAdded(element, delta); + updateIndexAddResource(element, delta); + } else { + elementRemoved(element, delta); + updateIndexRemoveResource(element, delta); + } + } } } }