1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Fix for PR 59098

This commit is contained in:
Alain Magloire 2004-04-20 00:45:21 +00:00
parent 7ef1a6ed7e
commit 97a3c316c8
4 changed files with 55 additions and 7 deletions

View file

@ -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

View file

@ -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)
*/

View file

@ -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();

View file

@ -525,8 +525,22 @@ public class DeltaProcessor {
}
}
if ((flags & IResourceDelta.DESCRIPTION) != 0) {
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);
}
}
}
}
}