mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=70109 & https://bugs.eclipse.org/bugs/show_bug.cgi?id=69548
This commit is contained in:
parent
0336349ebe
commit
6f08973e2d
6 changed files with 28 additions and 72 deletions
|
@ -44,7 +44,7 @@ public class ArchiveContainer extends Openable implements IArchiveContainer {
|
||||||
protected boolean buildStructure(OpenableInfo info, IProgressMonitor pm, Map newElements, IResource underlyingResource)
|
protected boolean buildStructure(OpenableInfo info, IProgressMonitor pm, Map newElements, IResource underlyingResource)
|
||||||
throws CModelException {
|
throws CModelException {
|
||||||
// this will bootstrap/start the runner for the project.
|
// this will bootstrap/start the runner for the project.
|
||||||
CModelManager.getDefault().getBinaryRunner(getCProject());
|
CModelManager.getDefault().getBinaryRunner(getCProject(), true);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ public class ArchiveContainerInfo extends OpenableInfo {
|
||||||
}
|
}
|
||||||
|
|
||||||
synchronized void sync() {
|
synchronized void sync() {
|
||||||
BinaryRunner runner = CModelManager.getDefault().getBinaryRunner(getElement().getCProject());
|
BinaryRunner runner = CModelManager.getDefault().getBinaryRunner(getElement().getCProject(), true);
|
||||||
if (runner != null) {
|
if (runner != null) {
|
||||||
runner.waitIfRunning();
|
runner.waitIfRunning();
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,7 +54,7 @@ public class BinaryContainer extends Openable implements IBinaryContainer {
|
||||||
protected boolean buildStructure(OpenableInfo info, IProgressMonitor pm, Map newElements, IResource underlyingResource)
|
protected boolean buildStructure(OpenableInfo info, IProgressMonitor pm, Map newElements, IResource underlyingResource)
|
||||||
throws CModelException {
|
throws CModelException {
|
||||||
// this will bootstrap/start the runner for the project.
|
// this will bootstrap/start the runner for the project.
|
||||||
CModelManager.getDefault().getBinaryRunner(getCProject());
|
CModelManager.getDefault().getBinaryRunner(getCProject(), true);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ public class BinaryContainerInfo extends OpenableInfo {
|
||||||
}
|
}
|
||||||
|
|
||||||
synchronized void sync() {
|
synchronized void sync() {
|
||||||
BinaryRunner runner = CModelManager.getDefault().getBinaryRunner(getElement().getCProject());
|
BinaryRunner runner = CModelManager.getDefault().getBinaryRunner(getElement().getCProject(), true);
|
||||||
if (runner != null) {
|
if (runner != null) {
|
||||||
runner.waitIfRunning();
|
runner.waitIfRunning();
|
||||||
}
|
}
|
||||||
|
|
|
@ -152,8 +152,7 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
|
||||||
|
|
||||||
// Register to the workspace;
|
// Register to the workspace;
|
||||||
ResourcesPlugin.getWorkspace().addResourceChangeListener(factory,
|
ResourcesPlugin.getWorkspace().addResourceChangeListener(factory,
|
||||||
IResourceChangeEvent.PRE_BUILD
|
IResourceChangeEvent.POST_CHANGE
|
||||||
| IResourceChangeEvent.POST_CHANGE
|
|
||||||
| IResourceChangeEvent.PRE_DELETE
|
| IResourceChangeEvent.PRE_DELETE
|
||||||
| IResourceChangeEvent.PRE_CLOSE);
|
| IResourceChangeEvent.PRE_CLOSE);
|
||||||
|
|
||||||
|
@ -585,14 +584,16 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public BinaryRunner getBinaryRunner(ICProject project) {
|
public BinaryRunner getBinaryRunner(ICProject project, boolean start) {
|
||||||
BinaryRunner runner = null;
|
BinaryRunner runner = null;
|
||||||
synchronized(binaryRunners) {
|
synchronized(binaryRunners) {
|
||||||
runner = (BinaryRunner)binaryRunners.get(project.getProject());
|
runner = (BinaryRunner)binaryRunners.get(project.getProject());
|
||||||
if (runner == null) {
|
if (runner == null) {
|
||||||
runner = new BinaryRunner(project.getProject());
|
runner = new BinaryRunner(project.getProject());
|
||||||
binaryRunners.put(project.getProject(), runner);
|
binaryRunners.put(project.getProject(), runner);
|
||||||
runner.start();
|
if (start) {
|
||||||
|
runner.start();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return runner;
|
return runner;
|
||||||
|
@ -601,6 +602,7 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
|
||||||
public void removeBinaryRunner(ICProject cproject) {
|
public void removeBinaryRunner(ICProject cproject) {
|
||||||
removeBinaryRunner(cproject.getProject());
|
removeBinaryRunner(cproject.getProject());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeBinaryRunner(IProject project) {
|
public void removeBinaryRunner(IProject project) {
|
||||||
BinaryRunner runner = (BinaryRunner) binaryRunners.remove(project);
|
BinaryRunner runner = (BinaryRunner) binaryRunners.remove(project);
|
||||||
if (runner != null) {
|
if (runner != null) {
|
||||||
|
@ -677,13 +679,6 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case IResourceChangeEvent.PRE_BUILD :
|
|
||||||
// No need now.
|
|
||||||
if(delta != null) {
|
|
||||||
this.checkProjectsBeingAddedOrRemoved(delta);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case IResourceChangeEvent.POST_CHANGE :
|
case IResourceChangeEvent.POST_CHANGE :
|
||||||
try {
|
try {
|
||||||
if (delta != null) {
|
if (delta != null) {
|
||||||
|
@ -928,52 +923,6 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Process the given delta and look for projects being added, opened,
|
|
||||||
* or closed
|
|
||||||
*/
|
|
||||||
public void checkProjectsBeingAddedOrRemoved(IResourceDelta delta) {
|
|
||||||
IResource resource = delta.getResource();
|
|
||||||
switch (resource.getType()) {
|
|
||||||
case IResource.ROOT :
|
|
||||||
if (this.cProjectsCache == null) {
|
|
||||||
try {
|
|
||||||
this.cProjectsCache = this.getCModel().getCProjects();
|
|
||||||
} catch (CModelException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
IResourceDelta[] children = delta.getAffectedChildren();
|
|
||||||
for (int i = 0, length = children.length; i < length; i++) {
|
|
||||||
this.checkProjectsBeingAddedOrRemoved(children[i]);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case IResource.PROJECT :
|
|
||||||
if (0 != (delta.getFlags() & IResourceDelta.OPEN)) {
|
|
||||||
IProject project = (IProject) resource;
|
|
||||||
if (!project.isOpen()) {
|
|
||||||
// project closing... stop the runner.
|
|
||||||
BinaryRunner runner = (BinaryRunner)binaryRunners.get(project);
|
|
||||||
if (runner != null ) {
|
|
||||||
runner.stop();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ( binaryRunners.get(project) == null ) {
|
|
||||||
// project opening... lets add the runner to the
|
|
||||||
// map but no need to start it since the deltas
|
|
||||||
// will populate containers
|
|
||||||
binaryRunners.put(project, new BinaryRunner(project));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (0 != (delta.getFlags() & IResourceDelta.REMOVED)) {
|
|
||||||
IProject project = (IProject) resource;
|
|
||||||
removeBinaryRunner(project);
|
|
||||||
binaryParsersMap.remove(project);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the set of elements which are out of synch with their buffers.
|
* Returns the set of elements which are out of synch with their buffers.
|
||||||
*/
|
*/
|
||||||
|
@ -1125,6 +1074,7 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
|
||||||
public void deleting(IProject project){
|
public void deleting(IProject project){
|
||||||
// discard all indexing jobs for this project
|
// discard all indexing jobs for this project
|
||||||
this.getIndexManager().discardJobs(project.getName());
|
this.getIndexManager().discardJobs(project.getName());
|
||||||
|
removeBinaryRunner(project);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -428,7 +428,7 @@ public class DeltaProcessor {
|
||||||
try {
|
try {
|
||||||
IResource resource = delta.getResource();
|
IResource resource = delta.getResource();
|
||||||
ICElement current = createElement(resource);
|
ICElement current = createElement(resource);
|
||||||
updateChildren = updateCurrentDeltaAndIndex(delta);
|
updateChildren = updateCurrentDeltaAndIndex(current, delta);
|
||||||
if (current == null || current instanceof ISourceRoot) {
|
if (current == null || current instanceof ISourceRoot) {
|
||||||
nonCResourcesChanged(parent, delta);
|
nonCResourcesChanged(parent, delta);
|
||||||
} else if (current instanceof ICProject) {
|
} else if (current instanceof ICProject) {
|
||||||
|
@ -437,7 +437,8 @@ public class DeltaProcessor {
|
||||||
if (!cprj.getProject().isOpen() || cModel.findCProject(cprj.getProject()) == null) {
|
if (!cprj.getProject().isOpen() || cModel.findCProject(cprj.getProject()) == null) {
|
||||||
nonCResourcesChanged(parent, delta);
|
nonCResourcesChanged(parent, delta);
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
if (current != null) {
|
||||||
parent = current;
|
parent = current;
|
||||||
}
|
}
|
||||||
} catch (CModelException e) {
|
} catch (CModelException e) {
|
||||||
|
@ -489,10 +490,9 @@ public class DeltaProcessor {
|
||||||
* Returns whether the children of the given delta must be processed.
|
* Returns whether the children of the given delta must be processed.
|
||||||
* @throws a CModelException if the delta doesn't correspond to a c element of the given type.
|
* @throws a CModelException if the delta doesn't correspond to a c element of the given type.
|
||||||
*/
|
*/
|
||||||
private boolean updateCurrentDeltaAndIndex(IResourceDelta delta) throws CModelException {
|
private boolean updateCurrentDeltaAndIndex(ICElement element, IResourceDelta delta) throws CModelException {
|
||||||
|
|
||||||
IResource resource = delta.getResource();
|
IResource resource = delta.getResource();
|
||||||
ICElement element = createElement(resource);
|
|
||||||
|
|
||||||
switch (delta.getKind()) {
|
switch (delta.getKind()) {
|
||||||
case IResourceDelta.ADDED :
|
case IResourceDelta.ADDED :
|
||||||
|
@ -500,7 +500,7 @@ public class DeltaProcessor {
|
||||||
updateIndexAddResource(element, delta);
|
updateIndexAddResource(element, delta);
|
||||||
elementAdded(element, delta);
|
elementAdded(element, delta);
|
||||||
}
|
}
|
||||||
return false;
|
return true;
|
||||||
|
|
||||||
case IResourceDelta.REMOVED :
|
case IResourceDelta.REMOVED :
|
||||||
if (element != null) {
|
if (element != null) {
|
||||||
|
@ -523,15 +523,21 @@ public class DeltaProcessor {
|
||||||
} else if (resource.getType() == IResource.PROJECT) {
|
} else if (resource.getType() == IResource.PROJECT) {
|
||||||
if ((flags & IResourceDelta.OPEN) != 0) {
|
if ((flags & IResourceDelta.OPEN) != 0) {
|
||||||
// project has been opened or closed
|
// project has been opened or closed
|
||||||
IProject res = (IProject)resource;
|
IProject project = (IProject)resource;
|
||||||
if (element != null) {
|
if (element != null) {
|
||||||
if (res.isOpen()) {
|
if (project.isOpen()) {
|
||||||
|
if ( CoreModel.hasCNature(project) ) {
|
||||||
|
// project opening... lets add the runner to the
|
||||||
|
// map but no need to start it since the deltas
|
||||||
|
// will populate containers
|
||||||
|
CModelManager.getDefault().getBinaryRunner((ICProject)element, false);
|
||||||
|
}
|
||||||
elementOpened(element, delta);
|
elementOpened(element, delta);
|
||||||
updateIndexAddResource(element, delta);
|
updateIndexAddResource(element, delta);
|
||||||
} else {
|
return true;
|
||||||
elementClosed(element, delta);
|
|
||||||
updateIndexRemoveResource(element, delta);
|
|
||||||
}
|
}
|
||||||
|
elementClosed(element, delta);
|
||||||
|
updateIndexRemoveResource(element, delta);
|
||||||
//Don't process children
|
//Don't process children
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -552,7 +558,7 @@ public class DeltaProcessor {
|
||||||
elementRemoved(element, delta);
|
elementRemoved(element, delta);
|
||||||
updateIndexRemoveResource(element, delta);
|
updateIndexRemoveResource(element, delta);
|
||||||
}
|
}
|
||||||
return false;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue