mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
2005-07-08 Alain Magloire
PR 100585:We need to bacth the fire of event. Actually the CModelOperation needed to be change to be aware of nested operation in the same thread. * model/org/eclipse/cdt/internal/core/model/BinaryRunner.java * model/org/eclipse/cdt/internal/core/model/CElement.java * model/org/eclipse/cdt/internal/core/model/CModel.java * model/org/eclipse/cdt/internal/core/model/CModelManager.java * model/org/eclipse/cdt/internal/core/model/CModelException.java * model/org/eclipse/cdt/internal/core/model/ContentTypeProcessor.java * model/org/eclipse/cdt/internal/core/model/PathEntryContainerUpdatesOperation.java * model/org/eclipse/cdt/internal/core/model/PathEntryManager.java * model/org/eclipse/cdt/internal/core/model/PathEntryStoreChangedOperation.java * model/org/eclipse/cdt/internal/core/model/SetPathEntryContainerOperation.java * model/org/eclipse/cdt/internal/core/model/TranslationUnit.java * model/org/eclipse/cdt/internal/core/model/WorkingCopy.java
This commit is contained in:
parent
f4e8db7930
commit
992e64134b
14 changed files with 538 additions and 310 deletions
|
@ -1,3 +1,24 @@
|
||||||
|
2005-07-08 Alain Magloire
|
||||||
|
PR 100585:We need to bacth the fire of event. Actually the CModelOperation needed to be
|
||||||
|
change to be aware of nested operation in the same thread.
|
||||||
|
* model/org/eclipse/cdt/internal/core/model/BinaryRunner.java
|
||||||
|
* model/org/eclipse/cdt/internal/core/model/CElement.java
|
||||||
|
* model/org/eclipse/cdt/internal/core/model/CModel.java
|
||||||
|
* model/org/eclipse/cdt/internal/core/model/CModelManager.java
|
||||||
|
* model/org/eclipse/cdt/internal/core/model/CModelException.java
|
||||||
|
* model/org/eclipse/cdt/internal/core/model/ContentTypeProcessor.java
|
||||||
|
* model/org/eclipse/cdt/internal/core/model/PathEntryContainerUpdatesOperation.java
|
||||||
|
* model/org/eclipse/cdt/internal/core/model/PathEntryManager.java
|
||||||
|
* model/org/eclipse/cdt/internal/core/model/PathEntryStoreChangedOperation.java
|
||||||
|
* model/org/eclipse/cdt/internal/core/model/SetPathEntryContainerOperation.java
|
||||||
|
* model/org/eclipse/cdt/internal/core/model/TranslationUnit.java
|
||||||
|
* model/org/eclipse/cdt/internal/core/model/WorkingCopy.java
|
||||||
|
|
||||||
|
2005-07-08 Alain Magloire
|
||||||
|
PR 102434: Patch from Chris Wiebe for the MachO parser
|
||||||
|
* model/org/eclipse/cdt/internal/core/model/CModelManager.java
|
||||||
|
* utils/org/eclipse/cdt/utils/macho/MachO.java
|
||||||
|
|
||||||
2005-07-06 David Inglis
|
2005-07-06 David Inglis
|
||||||
fixed bug#102546
|
fixed bug#102546
|
||||||
|
|
||||||
|
|
|
@ -15,10 +15,11 @@ import org.eclipse.cdt.core.CCorePlugin;
|
||||||
import org.eclipse.cdt.core.IBinaryParser.IBinaryFile;
|
import org.eclipse.cdt.core.IBinaryParser.IBinaryFile;
|
||||||
import org.eclipse.cdt.core.model.CModelException;
|
import org.eclipse.cdt.core.model.CModelException;
|
||||||
import org.eclipse.cdt.core.model.CoreModelUtil;
|
import org.eclipse.cdt.core.model.CoreModelUtil;
|
||||||
import org.eclipse.cdt.core.model.ElementChangedEvent;
|
|
||||||
import org.eclipse.cdt.core.model.ICElement;
|
import org.eclipse.cdt.core.model.ICElement;
|
||||||
|
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.IOutputEntry;
|
import org.eclipse.cdt.core.model.IOutputEntry;
|
||||||
|
import org.eclipse.cdt.core.model.IParent;
|
||||||
import org.eclipse.core.resources.IContainer;
|
import org.eclipse.core.resources.IContainer;
|
||||||
import org.eclipse.core.resources.IFile;
|
import org.eclipse.core.resources.IFile;
|
||||||
import org.eclipse.core.resources.IProject;
|
import org.eclipse.core.resources.IProject;
|
||||||
|
@ -37,6 +38,42 @@ import org.eclipse.core.runtime.jobs.Job;
|
||||||
|
|
||||||
public class BinaryRunner {
|
public class BinaryRunner {
|
||||||
|
|
||||||
|
class BinaryRunnerOperation extends CModelOperation {
|
||||||
|
|
||||||
|
BinaryRunnerOperation(ICProject cproj) {
|
||||||
|
super(cproj);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.internal.core.model.CModelOperation#isReadOnly()
|
||||||
|
*/
|
||||||
|
public boolean isReadOnly() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void executeOperation() throws CModelException {
|
||||||
|
ICProject cproj = (ICProject)getElementsToProcess()[0];
|
||||||
|
IParent[] containers = new IParent[2];
|
||||||
|
containers[0] = cproj.getBinaryContainer();
|
||||||
|
containers[1] = cproj.getArchiveContainer();
|
||||||
|
CModelManager factory = CModelManager.getDefault();
|
||||||
|
ICElement root = factory.getCModel();
|
||||||
|
CElementDelta cdelta = new CElementDelta(root);
|
||||||
|
cdelta.changed(cproj, ICElementDelta.F_CONTENT);
|
||||||
|
for (int j = 0; j < containers.length; ++j) {
|
||||||
|
IParent container = containers[j];
|
||||||
|
ICElement[] children = container.getChildren();
|
||||||
|
if (children.length > 0) {
|
||||||
|
cdelta.added((ICElement)container);
|
||||||
|
for (int i = 0; i < children.length; i++) {
|
||||||
|
cdelta.added(children[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
addDelta(cdelta);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
ICProject cproject;
|
ICProject cproject;
|
||||||
Job runner;
|
Job runner;
|
||||||
|
|
||||||
|
@ -68,8 +105,9 @@ public class BinaryRunner {
|
||||||
vbin.removeChildren();
|
vbin.removeChildren();
|
||||||
|
|
||||||
cproject.getProject().accept(new Visitor(monitor), IContainer.INCLUDE_PHANTOMS);
|
cproject.getProject().accept(new Visitor(monitor), IContainer.INCLUDE_PHANTOMS);
|
||||||
fireEvents(cproject, vbin);
|
|
||||||
fireEvents(cproject, vlib);
|
CModelOperation op = new BinaryRunnerOperation(cproject);
|
||||||
|
op.runOperation(monitor);
|
||||||
|
|
||||||
monitor.done();
|
monitor.done();
|
||||||
} catch (CoreException e) {
|
} catch (CoreException e) {
|
||||||
|
@ -100,27 +138,6 @@ public class BinaryRunner {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void fireEvents(ICProject cproj, Parent container) {
|
|
||||||
// Fired the event.
|
|
||||||
try {
|
|
||||||
ICElement[] children = container.getChildren();
|
|
||||||
if (children.length > 0) {
|
|
||||||
CModelManager factory = CModelManager.getDefault();
|
|
||||||
ICElement root = factory.getCModel();
|
|
||||||
CElementDelta cdelta = new CElementDelta(root);
|
|
||||||
cdelta.added(cproj);
|
|
||||||
cdelta.added(container);
|
|
||||||
for (int i = 0; i < children.length; i++) {
|
|
||||||
cdelta.added(children[i]);
|
|
||||||
}
|
|
||||||
factory.registerCModelDelta(cdelta);
|
|
||||||
factory.fire(ElementChangedEvent.POST_CHANGE);
|
|
||||||
}
|
|
||||||
} catch (CModelException e) {
|
|
||||||
//
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class Visitor implements IResourceProxyVisitor {
|
private class Visitor implements IResourceProxyVisitor {
|
||||||
private IProgressMonitor vMonitor;
|
private IProgressMonitor vMonitor;
|
||||||
private IProject project;
|
private IProject project;
|
||||||
|
|
|
@ -20,6 +20,7 @@ import org.eclipse.cdt.core.model.IOpenable;
|
||||||
import org.eclipse.cdt.core.model.IParent;
|
import org.eclipse.cdt.core.model.IParent;
|
||||||
import org.eclipse.cdt.core.model.ISourceRange;
|
import org.eclipse.cdt.core.model.ISourceRange;
|
||||||
import org.eclipse.cdt.core.model.ISourceReference;
|
import org.eclipse.cdt.core.model.ISourceReference;
|
||||||
|
import org.eclipse.cdt.core.model.ISourceRoot;
|
||||||
import org.eclipse.cdt.core.model.IWorkingCopy;
|
import org.eclipse.cdt.core.model.IWorkingCopy;
|
||||||
import org.eclipse.core.resources.IResource;
|
import org.eclipse.core.resources.IResource;
|
||||||
import org.eclipse.core.resources.ResourceAttributes;
|
import org.eclipse.core.resources.ResourceAttributes;
|
||||||
|
@ -260,6 +261,9 @@ public abstract class CElement extends PlatformObject implements ICElement {
|
||||||
case C_PROJECT:
|
case C_PROJECT:
|
||||||
return "CPROJECT"; //$NON-NLS-1$
|
return "CPROJECT"; //$NON-NLS-1$
|
||||||
case C_CCONTAINER:
|
case C_CCONTAINER:
|
||||||
|
if (this instanceof ISourceRoot) {
|
||||||
|
return "SOURCE_ROOT"; //$NON-NLS-1$
|
||||||
|
}
|
||||||
return "CCONTAINER"; //$NON-NLS-1$
|
return "CCONTAINER"; //$NON-NLS-1$
|
||||||
case C_UNIT:
|
case C_UNIT:
|
||||||
if (this instanceof IWorkingCopy) {
|
if (this instanceof IWorkingCopy) {
|
||||||
|
@ -292,18 +296,17 @@ public abstract class CElement extends PlatformObject implements ICElement {
|
||||||
return "C_NAMESPACE"; //$NON-NLS-1$
|
return "C_NAMESPACE"; //$NON-NLS-1$
|
||||||
case C_USING:
|
case C_USING:
|
||||||
return "C_USING"; //$NON-NLS-1$
|
return "C_USING"; //$NON-NLS-1$
|
||||||
|
case C_VCONTAINER:
|
||||||
|
return "C_CONTAINER"; //$NON-NLS-1$
|
||||||
|
case C_BINARY:
|
||||||
|
return "C_BINARY"; //$NON-NLS-1$
|
||||||
|
case C_ARCHIVE:
|
||||||
|
return "C_ARCHIVE"; //$NON-NLS-1$
|
||||||
default:
|
default:
|
||||||
return "UNKNOWN"; //$NON-NLS-1$
|
return "UNKNOWN"; //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Runs a C Model Operation
|
|
||||||
*/
|
|
||||||
protected void runOperation(CModelOperation operation, IProgressMonitor monitor) throws CModelException {
|
|
||||||
CModelManager.getDefault().runOperation(operation, monitor);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Close the C Element
|
* Close the C Element
|
||||||
* @throws CModelException
|
* @throws CModelException
|
||||||
|
|
|
@ -115,11 +115,13 @@ public class CModel extends Openable implements ICModel {
|
||||||
|
|
||||||
public void delete(ICElement[] elements, boolean force, IProgressMonitor monitor)
|
public void delete(ICElement[] elements, boolean force, IProgressMonitor monitor)
|
||||||
throws CModelException {
|
throws CModelException {
|
||||||
|
CModelOperation op;
|
||||||
if (elements != null && elements[0] != null && elements[0].getElementType() <= ICElement.C_UNIT) {
|
if (elements != null && elements[0] != null && elements[0].getElementType() <= ICElement.C_UNIT) {
|
||||||
runOperation(new DeleteResourceElementsOperation(elements, force), monitor);
|
op = new DeleteResourceElementsOperation(elements, force);
|
||||||
} else {
|
} else {
|
||||||
runOperation(new DeleteElementsOperation(elements, force), monitor);
|
op = new DeleteElementsOperation(elements, force);
|
||||||
}
|
}
|
||||||
|
op.runOperation(monitor);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void move(ICElement[] elements, ICElement[] containers, ICElement[] siblings,
|
public void move(ICElement[] elements, ICElement[] containers, ICElement[] siblings,
|
||||||
|
@ -133,12 +135,13 @@ public class CModel extends Openable implements ICModel {
|
||||||
|
|
||||||
public void rename(ICElement[] elements, ICElement[] destinations, String[] renamings,
|
public void rename(ICElement[] elements, ICElement[] destinations, String[] renamings,
|
||||||
boolean force, IProgressMonitor monitor) throws CModelException {
|
boolean force, IProgressMonitor monitor) throws CModelException {
|
||||||
|
CModelOperation op;
|
||||||
if (elements != null && elements[0] != null && elements[0].getElementType() <= ICElement.C_UNIT) {
|
if (elements != null && elements[0] != null && elements[0].getElementType() <= ICElement.C_UNIT) {
|
||||||
runOperation(new RenameResourceElementsOperation(elements, destinations,
|
op = new RenameResourceElementsOperation(elements, destinations, renamings, force);
|
||||||
renamings, force), monitor);
|
|
||||||
} else {
|
} else {
|
||||||
runOperation(new RenameElementsOperation(elements, destinations, renamings, force), monitor);
|
op = new RenameElementsOperation(elements, destinations, renamings, force);
|
||||||
}
|
}
|
||||||
|
op.runOperation(monitor);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -151,7 +154,7 @@ public class CModel extends Openable implements ICModel {
|
||||||
op.setInsertBefore(elements[i], siblings[i]);
|
op.setInsertBefore(elements[i], siblings[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
runOperation(op, monitor);
|
op.runOperation(monitor);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected CElementInfo createElementInfo () {
|
protected CElementInfo createElementInfo () {
|
||||||
|
|
|
@ -50,13 +50,11 @@ import org.eclipse.core.resources.IResource;
|
||||||
import org.eclipse.core.resources.IResourceChangeEvent;
|
import org.eclipse.core.resources.IResourceChangeEvent;
|
||||||
import org.eclipse.core.resources.IResourceChangeListener;
|
import org.eclipse.core.resources.IResourceChangeListener;
|
||||||
import org.eclipse.core.resources.IResourceDelta;
|
import org.eclipse.core.resources.IResourceDelta;
|
||||||
import org.eclipse.core.resources.IResourceStatus;
|
|
||||||
import org.eclipse.core.resources.IWorkspace;
|
import org.eclipse.core.resources.IWorkspace;
|
||||||
import org.eclipse.core.resources.IWorkspaceRoot;
|
import org.eclipse.core.resources.IWorkspaceRoot;
|
||||||
import org.eclipse.core.resources.ResourcesPlugin;
|
import org.eclipse.core.resources.ResourcesPlugin;
|
||||||
import org.eclipse.core.runtime.CoreException;
|
import org.eclipse.core.runtime.CoreException;
|
||||||
import org.eclipse.core.runtime.IPath;
|
import org.eclipse.core.runtime.IPath;
|
||||||
import org.eclipse.core.runtime.IProgressMonitor;
|
|
||||||
import org.eclipse.core.runtime.ISafeRunnable;
|
import org.eclipse.core.runtime.ISafeRunnable;
|
||||||
import org.eclipse.core.runtime.Platform;
|
import org.eclipse.core.runtime.Platform;
|
||||||
import org.eclipse.core.runtime.content.IContentTypeManager.IContentTypeChangeListener;
|
import org.eclipse.core.runtime.content.IContentTypeManager.IContentTypeChangeListener;
|
||||||
|
@ -80,8 +78,6 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
|
||||||
*/
|
*/
|
||||||
protected DeltaProcessor fDeltaProcessor = new DeltaProcessor();
|
protected DeltaProcessor fDeltaProcessor = new DeltaProcessor();
|
||||||
|
|
||||||
protected ContentTypeProcessor fContentTypeProcessor = new ContentTypeProcessor();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Queue of deltas created explicily by the C Model that
|
* Queue of deltas created explicily by the C Model that
|
||||||
* have yet to be fired.
|
* have yet to be fired.
|
||||||
|
@ -563,8 +559,9 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
|
||||||
}
|
}
|
||||||
byte[] bytes = new byte[hints];
|
byte[] bytes = new byte[hints];
|
||||||
if (hints > 0) {
|
if (hints > 0) {
|
||||||
|
InputStream is = null;
|
||||||
try {
|
try {
|
||||||
InputStream is = file.getContents();
|
is = file.getContents();
|
||||||
int count = 0;
|
int count = 0;
|
||||||
// Make sure we read up to 'hints' bytes if we possibly can
|
// Make sure we read up to 'hints' bytes if we possibly can
|
||||||
while (count < hints) {
|
while (count < hints) {
|
||||||
|
@ -573,7 +570,6 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
|
||||||
break;
|
break;
|
||||||
count += bytesRead;
|
count += bytesRead;
|
||||||
}
|
}
|
||||||
is.close();
|
|
||||||
if (count > 0 && count < bytes.length) {
|
if (count > 0 && count < bytes.length) {
|
||||||
byte[] array = new byte[count];
|
byte[] array = new byte[count];
|
||||||
System.arraycopy(bytes, 0, array, 0, count);
|
System.arraycopy(bytes, 0, array, 0, count);
|
||||||
|
@ -583,6 +579,14 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
|
||||||
return null;
|
return null;
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
return null;
|
return null;
|
||||||
|
} finally {
|
||||||
|
if (is != null) {
|
||||||
|
try {
|
||||||
|
is.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -775,7 +779,11 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
|
||||||
* @see org.eclipse.core.runtime.content.IContentTypeManager.IContentTypeListener#contentTypeChanged()
|
* @see org.eclipse.core.runtime.content.IContentTypeManager.IContentTypeListener#contentTypeChanged()
|
||||||
*/
|
*/
|
||||||
public void contentTypeChanged(ContentTypeChangeEvent event) {
|
public void contentTypeChanged(ContentTypeChangeEvent event) {
|
||||||
fContentTypeProcessor.processContentTypeChanges(event);
|
ContentTypeProcessor.processContentTypeChanges(new ContentTypeChangeEvent[]{ event });
|
||||||
|
}
|
||||||
|
|
||||||
|
public void contentTypeChanged(ContentTypeChangeEvent[] events) {
|
||||||
|
ContentTypeProcessor.processContentTypeChanges(events);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void fire(int eventType) {
|
public void fire(int eventType) {
|
||||||
|
@ -786,7 +794,7 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
|
||||||
* Fire C Model deltas, flushing them after the fact.
|
* Fire C Model deltas, flushing them after the fact.
|
||||||
* If the firing mode has been turned off, this has no effect.
|
* If the firing mode has been turned off, this has no effect.
|
||||||
*/
|
*/
|
||||||
public void fire(ICElementDelta customDeltas, int eventType) {
|
void fire(ICElementDelta customDeltas, int eventType) {
|
||||||
if (fFire) {
|
if (fFire) {
|
||||||
ICElementDelta deltaToNotify;
|
ICElementDelta deltaToNotify;
|
||||||
if (customDeltas == null) {
|
if (customDeltas == null) {
|
||||||
|
@ -945,38 +953,6 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Runs a C Model Operation
|
|
||||||
*/
|
|
||||||
public void runOperation(CModelOperation operation, IProgressMonitor monitor) throws CModelException {
|
|
||||||
boolean hadAwaitingDeltas = !fCModelDeltas.isEmpty();
|
|
||||||
try {
|
|
||||||
if (operation.isReadOnly()) {
|
|
||||||
operation.run(monitor);
|
|
||||||
} else {
|
|
||||||
// use IWorkspace.run(...) to ensure that a build will be done in autobuild mode
|
|
||||||
getCModel().getUnderlyingResource().getWorkspace()
|
|
||||||
.run(operation, operation.getSchedulingRule(), IWorkspace.AVOID_UPDATE, monitor);
|
|
||||||
}
|
|
||||||
} catch (CoreException ce) {
|
|
||||||
if (ce instanceof CModelException) {
|
|
||||||
throw (CModelException)ce;
|
|
||||||
} else if (ce.getStatus().getCode() == IResourceStatus.OPERATION_FAILED) {
|
|
||||||
Throwable e = ce.getStatus().getException();
|
|
||||||
if (e instanceof CModelException) {
|
|
||||||
throw (CModelException)e;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
throw new CModelException(ce);
|
|
||||||
} finally {
|
|
||||||
// fire only if there were no awaiting deltas (if there were, they would come from a resource modifying operation)
|
|
||||||
// and the operation has not modified any resource
|
|
||||||
if (!hadAwaitingDeltas && !operation.hasModifiedResource()) {
|
|
||||||
fire(ElementChangedEvent.POST_CHANGE);
|
|
||||||
} // else deltas are fired while processing the resource delta
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -5,6 +5,7 @@ package org.eclipse.cdt.internal.core.model;
|
||||||
* All Rights Reserved.
|
* All Rights Reserved.
|
||||||
*/
|
*/
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.model.CModelException;
|
import org.eclipse.cdt.core.model.CModelException;
|
||||||
|
@ -95,6 +96,11 @@ public abstract class CModelOperation implements IWorkspaceRunnable, IProgressMo
|
||||||
*/
|
*/
|
||||||
protected boolean hasModifiedResource = false;
|
protected boolean hasModifiedResource = false;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* A per thread stack of java model operations (PerThreadObject of ArrayList).
|
||||||
|
*/
|
||||||
|
protected static ThreadLocal operationStacks = new ThreadLocal();
|
||||||
|
|
||||||
protected CModelOperation() {
|
protected CModelOperation() {
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
|
@ -162,7 +168,7 @@ public abstract class CModelOperation implements IWorkspaceRunnable, IProgressMo
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Registers the given reconcile delta with the Java Model Manager.
|
* Registers the given reconcile delta with the C Model Manager.
|
||||||
*/
|
*/
|
||||||
protected void addReconcileDelta(IWorkingCopy workingCopy, ICElementDelta delta) {
|
protected void addReconcileDelta(IWorkingCopy workingCopy, ICElementDelta delta) {
|
||||||
HashMap reconcileDeltas = CModelManager.getDefault().reconcileDeltas;
|
HashMap reconcileDeltas = CModelManager.getDefault().reconcileDeltas;
|
||||||
|
@ -531,6 +537,53 @@ public abstract class CModelOperation implements IWorkspaceRunnable, IProgressMo
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns the stack of operations running in the current thread.
|
||||||
|
* Returns an empty stack if no operations are currently running in this thread.
|
||||||
|
*/
|
||||||
|
protected ArrayList getCurrentOperationStack() {
|
||||||
|
ArrayList stack = (ArrayList)operationStacks.get();
|
||||||
|
if (stack == null) {
|
||||||
|
stack = new ArrayList();
|
||||||
|
operationStacks.set(stack);
|
||||||
|
}
|
||||||
|
return stack;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Removes the last pushed operation from the stack of running operations.
|
||||||
|
* Returns the poped operation or null if the stack was empty.
|
||||||
|
*/
|
||||||
|
protected CModelOperation popOperation() {
|
||||||
|
ArrayList stack = getCurrentOperationStack();
|
||||||
|
int size = stack.size();
|
||||||
|
if (size > 0) {
|
||||||
|
if (size == 1) { // top level operation
|
||||||
|
operationStacks.set(null); // release reference (see http://bugs.eclipse.org/bugs/show_bug.cgi?id=33927)
|
||||||
|
}
|
||||||
|
return (CModelOperation)stack.remove(size-1);
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Pushes the given operation on the stack of operations currently running in this thread.
|
||||||
|
*/
|
||||||
|
protected void pushOperation(CModelOperation operation) {
|
||||||
|
getCurrentOperationStack().add(operation);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns whether this operation is the first operation to run in the current thread.
|
||||||
|
*/
|
||||||
|
protected boolean isTopLevelOperation() {
|
||||||
|
ArrayList stack;
|
||||||
|
return
|
||||||
|
(stack = this.getCurrentOperationStack()).size() > 0
|
||||||
|
&& stack.get(0) == this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Main entry point for C Model operations. Executes this operation
|
* Main entry point for C Model operations. Executes this operation
|
||||||
* and registers any deltas created.
|
* and registers any deltas created.
|
||||||
|
@ -541,18 +594,56 @@ public abstract class CModelOperation implements IWorkspaceRunnable, IProgressMo
|
||||||
public void run(IProgressMonitor monitor) throws CoreException {
|
public void run(IProgressMonitor monitor) throws CoreException {
|
||||||
CModelManager manager= CModelManager.getDefault();
|
CModelManager manager= CModelManager.getDefault();
|
||||||
int previousDeltaCount = manager.fCModelDeltas.size();
|
int previousDeltaCount = manager.fCModelDeltas.size();
|
||||||
|
pushOperation(this);
|
||||||
try {
|
try {
|
||||||
fMonitor = monitor;
|
fMonitor = monitor;
|
||||||
execute();
|
execute();
|
||||||
} finally {
|
} finally {
|
||||||
|
try {
|
||||||
registerDeltas();
|
registerDeltas();
|
||||||
// Fire if we change somethings
|
// Fire if we change somethings
|
||||||
|
if (isTopLevelOperation()) {
|
||||||
if ((manager.fCModelDeltas.size() > previousDeltaCount || !manager.reconcileDeltas.isEmpty())
|
if ((manager.fCModelDeltas.size() > previousDeltaCount || !manager.reconcileDeltas.isEmpty())
|
||||||
&& !this.hasModifiedResource()) {
|
&& !this.hasModifiedResource()) {
|
||||||
manager.fire(ElementChangedEvent.POST_CHANGE);
|
manager.fire(ElementChangedEvent.POST_CHANGE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} finally {
|
||||||
|
popOperation();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Main entry point for C Model operations. Runs a C Model Operation as an IWorkspaceRunnable
|
||||||
|
* if not read-only.
|
||||||
|
*/
|
||||||
|
public void runOperation(IProgressMonitor monitor) throws CModelException {
|
||||||
|
ICModelStatus status = verify();
|
||||||
|
if (!status.isOK()) {
|
||||||
|
throw new CModelException(status);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
if (isReadOnly()) {
|
||||||
|
run(monitor);
|
||||||
|
} else {
|
||||||
|
// use IWorkspace.run(...) to ensure that a build will be done in autobuild mode
|
||||||
|
getCModel().getUnderlyingResource().getWorkspace()
|
||||||
|
.run(this, getSchedulingRule(), IWorkspace.AVOID_UPDATE, monitor);
|
||||||
|
}
|
||||||
|
} catch (CoreException ce) {
|
||||||
|
if (ce instanceof CModelException) {
|
||||||
|
throw (CModelException)ce;
|
||||||
|
} else if (ce.getStatus().getCode() == IResourceStatus.OPERATION_FAILED) {
|
||||||
|
Throwable e = ce.getStatus().getException();
|
||||||
|
if (e instanceof CModelException) {
|
||||||
|
throw (CModelException)e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw new CModelException(ce);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see IProgressMonitor
|
* @see IProgressMonitor
|
||||||
|
|
|
@ -17,7 +17,6 @@ import java.util.List;
|
||||||
import org.eclipse.cdt.core.CCorePlugin;
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
import org.eclipse.cdt.core.model.CModelException;
|
import org.eclipse.cdt.core.model.CModelException;
|
||||||
import org.eclipse.cdt.core.model.CoreModel;
|
import org.eclipse.cdt.core.model.CoreModel;
|
||||||
import org.eclipse.cdt.core.model.ElementChangedEvent;
|
|
||||||
import org.eclipse.cdt.core.model.ICElement;
|
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.ICModel;
|
import org.eclipse.cdt.core.model.ICModel;
|
||||||
|
@ -38,31 +37,54 @@ import org.eclipse.core.runtime.preferences.IScopeContext;
|
||||||
/**
|
/**
|
||||||
* ContentType processor
|
* ContentType processor
|
||||||
*/
|
*/
|
||||||
public class ContentTypeProcessor {
|
public class ContentTypeProcessor extends CModelOperation {
|
||||||
|
|
||||||
CModelManager fManager;
|
CModelManager fManager;
|
||||||
CElementDelta fCurrentDelta;
|
CElementDelta fCurrentDelta;
|
||||||
|
ContentTypeChangeEvent[] fEvents;
|
||||||
|
|
||||||
public void processContentTypeChanges(ContentTypeChangeEvent event) {
|
public ContentTypeProcessor(ContentTypeChangeEvent[] events) {
|
||||||
ICElement root = CModelManager.getDefault().getCModel();
|
super(CModelManager.getDefault().getCModel());
|
||||||
fCurrentDelta = new CElementDelta(root);
|
this.fEvents = events;
|
||||||
fManager = CModelManager.getDefault();
|
fManager = CModelManager.getDefault();
|
||||||
IContentType contentType = event.getContentType();
|
ICElement root = fManager.getCModel();
|
||||||
|
fCurrentDelta = new CElementDelta(root);
|
||||||
|
}
|
||||||
|
|
||||||
// only interested in our contentTypes
|
/* (non-Javadoc)
|
||||||
// Go through the events and generate deltas
|
* @see org.eclipse.cdt.internal.core.model.CModelOperation#isReadOnly()
|
||||||
ICProject[] cprojects = getAffectedProjects(event);
|
*/
|
||||||
|
public boolean isReadOnly() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void executeOperation() throws CModelException {
|
||||||
|
for (int i = 0; i < fEvents.length; ++i) {
|
||||||
|
IContentType contentType = fEvents[i].getContentType();
|
||||||
|
IScopeContext context = fEvents[i].getContext();
|
||||||
|
ICProject[] cprojects = getAffectedProjects(fEvents[i]);
|
||||||
for (int k = 0; k < cprojects.length; ++k) {
|
for (int k = 0; k < cprojects.length; ++k) {
|
||||||
ICProject cproject = cprojects[k];
|
processContentType(cprojects[k], contentType, context);
|
||||||
processContentType(cproject, contentType, event.getContext());
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fCurrentDelta.getAffectedChildren().length > 0) {
|
if (fCurrentDelta.getAffectedChildren().length > 0) {
|
||||||
fManager.fire(fCurrentDelta, ElementChangedEvent.POST_CHANGE);
|
addDelta(fCurrentDelta);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean isRegisteredContentTypeId(String id) {
|
|
||||||
|
|
||||||
|
static public void processContentTypeChanges(ContentTypeChangeEvent[] events) {
|
||||||
|
try {
|
||||||
|
CModelOperation op = new ContentTypeProcessor(events);
|
||||||
|
op.runOperation(null);
|
||||||
|
} catch (CModelException e) {
|
||||||
|
//
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isRegisteredContentTypeId(String id) {
|
||||||
String[] ids = CoreModel.getRegistedContentTypeIds();
|
String[] ids = CoreModel.getRegistedContentTypeIds();
|
||||||
for (int i = 0; i < ids.length; i++) {
|
for (int i = 0; i < ids.length; i++) {
|
||||||
if (ids[i].equals(id)) {
|
if (ids[i].equals(id)) {
|
||||||
|
@ -72,7 +94,7 @@ public class ContentTypeProcessor {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void processContentType(ICElement celement, IContentType contentType, IScopeContext context) {
|
protected void processContentType(ICElement celement, IContentType contentType, IScopeContext context) {
|
||||||
if (celement instanceof IOpenable) {
|
if (celement instanceof IOpenable) {
|
||||||
int type = celement.getElementType();
|
int type = celement.getElementType();
|
||||||
// if the type is not a TranslationUnit
|
// if the type is not a TranslationUnit
|
||||||
|
@ -139,14 +161,12 @@ public class ContentTypeProcessor {
|
||||||
String id = ((ITranslationUnit)celement).getContentTypeId();
|
String id = ((ITranslationUnit)celement).getContentTypeId();
|
||||||
if (contentType.getId().equals(id)) {
|
if (contentType.getId().equals(id)) {
|
||||||
try {
|
try {
|
||||||
if (! contentType.isAssociatedWith(celement.getElementName(), context)) {
|
|
||||||
IContentType cType = CCorePlugin.getContentType(celement.getCProject().getProject(), celement.getElementName());
|
IContentType cType = CCorePlugin.getContentType(celement.getCProject().getProject(), celement.getElementName());
|
||||||
if (cType != null && isRegisteredContentTypeId(cType.getId())) {
|
if (cType != null && isRegisteredContentTypeId(cType.getId())) {
|
||||||
elementChanged(celement);
|
elementChanged(celement);
|
||||||
} else {
|
} else {
|
||||||
elementRemoved(celement, celement.getParent());
|
elementRemoved(celement, celement.getParent());
|
||||||
}
|
}
|
||||||
}
|
|
||||||
} catch (CoreException e) {
|
} catch (CoreException e) {
|
||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
@ -224,7 +244,7 @@ public class ContentTypeProcessor {
|
||||||
fManager.releaseCElement(celement);
|
fManager.releaseCElement(celement);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void elementChanged(ICElement element) throws CModelException {
|
private void elementChanged(ICElement element) throws CModelException {
|
||||||
// For Binary/Archive We can not call close() to do the work
|
// For Binary/Archive We can not call close() to do the work
|
||||||
// closing will remove the element from the {Binary,Archive}Container
|
// closing will remove the element from the {Binary,Archive}Container
|
||||||
// We neef to clear the cache explicitely
|
// We neef to clear the cache explicitely
|
||||||
|
|
|
@ -0,0 +1,90 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2005 QnX Software Systems and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Qnx Software Systems - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.internal.core.model;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.model.CModelException;
|
||||||
|
import org.eclipse.cdt.core.model.CoreModel;
|
||||||
|
import org.eclipse.cdt.core.model.ICElement;
|
||||||
|
import org.eclipse.cdt.core.model.ICElementDelta;
|
||||||
|
import org.eclipse.cdt.core.model.ICProject;
|
||||||
|
import org.eclipse.cdt.core.model.IOpenable;
|
||||||
|
import org.eclipse.cdt.core.model.IPathEntryContainer;
|
||||||
|
import org.eclipse.cdt.core.model.IPathEntryContainerExtension;
|
||||||
|
import org.eclipse.cdt.core.model.PathEntryContainerChanged;
|
||||||
|
|
||||||
|
public class PathEntryContainerUpdatesOperation extends CModelOperation {
|
||||||
|
|
||||||
|
IPathEntryContainerExtension container;
|
||||||
|
PathEntryContainerChanged[] events;
|
||||||
|
|
||||||
|
public PathEntryContainerUpdatesOperation(IPathEntryContainerExtension container, PathEntryContainerChanged[] events) {
|
||||||
|
super(CModelManager.getDefault().getCModel());
|
||||||
|
this.container = container;
|
||||||
|
this.events = events;
|
||||||
|
}
|
||||||
|
protected void executeOperation() throws CModelException {
|
||||||
|
PathEntryManager pathEntryManager = PathEntryManager.getDefault();
|
||||||
|
ArrayList list = new ArrayList(events.length);
|
||||||
|
for (int i = 0; i < events.length; ++i) {
|
||||||
|
PathEntryContainerChanged event = events[i];
|
||||||
|
ICElement celement = CoreModel.getDefault().create(event.getPath());
|
||||||
|
if (celement != null) {
|
||||||
|
// Sanity check the container __must__ be set on the project.
|
||||||
|
boolean foundContainer = false;
|
||||||
|
IPathEntryContainer[] containers = pathEntryManager.getPathEntryContainers(celement.getCProject());
|
||||||
|
for (int k = 0 ; k < containers.length; ++k) {
|
||||||
|
if (containers[k].getPath().equals(container.getPath())) {
|
||||||
|
foundContainer = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!foundContainer) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// remove the element info caching.
|
||||||
|
if (celement instanceof IOpenable) {
|
||||||
|
try {
|
||||||
|
((IOpenable)celement).close();
|
||||||
|
// Make sure we clear the cache on the project too
|
||||||
|
if (!(celement instanceof ICProject)) {
|
||||||
|
celement.getCProject().close();
|
||||||
|
}
|
||||||
|
} catch (CModelException e) {
|
||||||
|
// ignore.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int flag =0;
|
||||||
|
if (event.isIncludeChange()) {
|
||||||
|
flag |= ICElementDelta.F_CHANGED_PATHENTRY_INCLUDE;
|
||||||
|
}
|
||||||
|
if (event.isMacroChange()) {
|
||||||
|
flag |= ICElementDelta.F_CHANGED_PATHENTRY_MACRO;
|
||||||
|
}
|
||||||
|
CElementDelta delta = new CElementDelta(celement.getCModel());
|
||||||
|
delta.changed(celement, flag);
|
||||||
|
list.add(delta);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (list.size() > 0) {
|
||||||
|
final ICElementDelta[] deltas = new ICElementDelta[list.size()];
|
||||||
|
list.toArray(deltas);
|
||||||
|
CModelManager manager = CModelManager.getDefault();
|
||||||
|
for (int i = 0; i < deltas.length; i++) {
|
||||||
|
addDelta(deltas[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -37,7 +37,6 @@ import org.eclipse.cdt.core.model.IIncludeFileEntry;
|
||||||
import org.eclipse.cdt.core.model.ILibraryEntry;
|
import org.eclipse.cdt.core.model.ILibraryEntry;
|
||||||
import org.eclipse.cdt.core.model.IMacroEntry;
|
import org.eclipse.cdt.core.model.IMacroEntry;
|
||||||
import org.eclipse.cdt.core.model.IMacroFileEntry;
|
import org.eclipse.cdt.core.model.IMacroFileEntry;
|
||||||
import org.eclipse.cdt.core.model.IOpenable;
|
|
||||||
import org.eclipse.cdt.core.model.IOutputEntry;
|
import org.eclipse.cdt.core.model.IOutputEntry;
|
||||||
import org.eclipse.cdt.core.model.IPathEntry;
|
import org.eclipse.cdt.core.model.IPathEntry;
|
||||||
import org.eclipse.cdt.core.model.IPathEntryContainer;
|
import org.eclipse.cdt.core.model.IPathEntryContainer;
|
||||||
|
@ -518,7 +517,7 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
|
||||||
try {
|
try {
|
||||||
IPathEntry[] oldResolvedEntries = getCachedResolvedPathEntries(cproject);
|
IPathEntry[] oldResolvedEntries = getCachedResolvedPathEntries(cproject);
|
||||||
SetPathEntriesOperation op = new SetPathEntriesOperation(cproject, oldResolvedEntries, newEntries);
|
SetPathEntriesOperation op = new SetPathEntriesOperation(cproject, oldResolvedEntries, newEntries);
|
||||||
CModelManager.getDefault().runOperation(op, monitor);
|
op.runOperation(monitor);
|
||||||
} catch (CoreException e) {
|
} catch (CoreException e) {
|
||||||
throw new CModelException(e);
|
throw new CModelException(e);
|
||||||
}
|
}
|
||||||
|
@ -570,96 +569,9 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
|
||||||
|
|
||||||
public void setPathEntryContainer(ICProject[] affectedProjects, IPathEntryContainer newContainer, IProgressMonitor monitor)
|
public void setPathEntryContainer(ICProject[] affectedProjects, IPathEntryContainer newContainer, IProgressMonitor monitor)
|
||||||
throws CModelException {
|
throws CModelException {
|
||||||
if (monitor != null && monitor.isCanceled()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
IPath containerPath = (newContainer == null) ? new Path("") : newContainer.getPath(); //$NON-NLS-1$
|
|
||||||
final int projectLength = affectedProjects.length;
|
|
||||||
final ICProject[] modifiedProjects = new ICProject[projectLength];
|
|
||||||
System.arraycopy(affectedProjects, 0, modifiedProjects, 0, projectLength);
|
|
||||||
final IPathEntry[][] oldResolvedEntries = new IPathEntry[projectLength][];
|
|
||||||
// filter out unmodified project containers
|
|
||||||
int remaining = 0;
|
|
||||||
for (int i = 0; i < projectLength; i++) {
|
|
||||||
if (monitor != null && monitor.isCanceled()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ICProject affectedProject = affectedProjects[i];
|
|
||||||
boolean found = false;
|
|
||||||
IPathEntry[] rawPath = getRawPathEntries(affectedProject);
|
|
||||||
for (int j = 0, cpLength = rawPath.length; j < cpLength; j++) {
|
|
||||||
IPathEntry entry = rawPath[j];
|
|
||||||
if (entry.getEntryKind() == IPathEntry.CDT_CONTAINER) {
|
|
||||||
IContainerEntry cont = (IContainerEntry)entry;
|
|
||||||
if (cont.getPath().equals(containerPath)) {
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!found) {
|
|
||||||
// filter out this project - does not reference the container
|
|
||||||
// path
|
|
||||||
modifiedProjects[i] = null;
|
|
||||||
// Still add it to the cache
|
|
||||||
containerPut(affectedProject, containerPath, newContainer);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
IPathEntryContainer oldContainer = containerGet(affectedProject, containerPath, true);
|
|
||||||
if (oldContainer != null && newContainer != null && oldContainer.equals(newContainer)) {
|
|
||||||
modifiedProjects[i] = null; // filter out this project -
|
|
||||||
// container did not change
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
remaining++;
|
|
||||||
oldResolvedEntries[i] = removeCachedResolvedPathEntries(affectedProject);
|
|
||||||
containerPut(affectedProject, containerPath, newContainer);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Nothing change.
|
SetPathEntryContainerOperation op = new SetPathEntryContainerOperation(affectedProjects, newContainer);
|
||||||
if (remaining == 0) {
|
op.runOperation(monitor);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// trigger model refresh
|
|
||||||
try {
|
|
||||||
//final boolean canChangeResources =
|
|
||||||
// !ResourcesPlugin.getWorkspace().isTreeLocked();
|
|
||||||
CoreModel.run(new IWorkspaceRunnable() {
|
|
||||||
|
|
||||||
public void run(IProgressMonitor progressMonitor) throws CoreException {
|
|
||||||
|
|
||||||
boolean shouldFire = false;
|
|
||||||
CModelManager mgr = CModelManager.getDefault();
|
|
||||||
for (int i = 0; i < projectLength; i++) {
|
|
||||||
if (progressMonitor != null && progressMonitor.isCanceled()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ICProject affectedProject = modifiedProjects[i];
|
|
||||||
if (affectedProject == null) {
|
|
||||||
continue; // was filtered out
|
|
||||||
}
|
|
||||||
// Only fire deltas if we had previous cache
|
|
||||||
if (oldResolvedEntries[i] != null) {
|
|
||||||
IPathEntry[] newEntries = getResolvedPathEntries(affectedProject);
|
|
||||||
ICElementDelta[] deltas = generatePathEntryDeltas(affectedProject, oldResolvedEntries[i], newEntries);
|
|
||||||
if (deltas.length > 0) {
|
|
||||||
affectedProject.close();
|
|
||||||
shouldFire = true;
|
|
||||||
for (int j = 0; j < deltas.length; j++) {
|
|
||||||
mgr.registerCModelDelta(deltas[j]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (shouldFire) {
|
|
||||||
mgr.fire(ElementChangedEvent.POST_CHANGE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, monitor);
|
|
||||||
} catch (CoreException e) {
|
|
||||||
//
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized IPathEntryContainer[] getPathEntryContainers(ICProject cproject) {
|
public synchronized IPathEntryContainer[] getPathEntryContainers(ICProject cproject) {
|
||||||
|
@ -780,7 +692,7 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized IPathEntryContainer containerGet(ICProject cproject, IPath containerPath, boolean bCreateLock) {
|
synchronized IPathEntryContainer containerGet(ICProject cproject, IPath containerPath, boolean bCreateLock) {
|
||||||
Map projectContainers = (Map)Containers.get(cproject);
|
Map projectContainers = (Map)Containers.get(cproject);
|
||||||
if (projectContainers == null) {
|
if (projectContainers == null) {
|
||||||
projectContainers = new HashMap();
|
projectContainers = new HashMap();
|
||||||
|
@ -795,7 +707,7 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
|
||||||
return container;
|
return container;
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized void containerPut(ICProject cproject, IPath containerPath, IPathEntryContainer container) {
|
synchronized void containerPut(ICProject cproject, IPath containerPath, IPathEntryContainer container) {
|
||||||
Map projectContainers = (Map)Containers.get(cproject);
|
Map projectContainers = (Map)Containers.get(cproject);
|
||||||
if (projectContainers == null) {
|
if (projectContainers == null) {
|
||||||
projectContainers = new HashMap();
|
projectContainers = new HashMap();
|
||||||
|
@ -814,71 +726,18 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized void containerRemove(ICProject cproject) {
|
synchronized void containerRemove(ICProject cproject) {
|
||||||
Containers.remove(cproject);
|
Containers.remove(cproject);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void pathEntryContainerUpdates(IPathEntryContainerExtension container, PathEntryContainerChanged[] events, IProgressMonitor monitor) {
|
public void pathEntryContainerUpdates(IPathEntryContainerExtension container, PathEntryContainerChanged[] events, IProgressMonitor monitor) {
|
||||||
|
|
||||||
ArrayList list = new ArrayList(events.length);
|
PathEntryContainerUpdatesOperation op = new PathEntryContainerUpdatesOperation(container, events);
|
||||||
for (int i = 0; i < events.length; ++i) {
|
|
||||||
PathEntryContainerChanged event = events[i];
|
|
||||||
ICElement celement = CoreModel.getDefault().create(event.getPath());
|
|
||||||
if (celement != null) {
|
|
||||||
// Sanity check the container __must__ be set on the project.
|
|
||||||
boolean foundContainer = false;
|
|
||||||
IPathEntryContainer[] containers = getPathEntryContainers(celement.getCProject());
|
|
||||||
for (int k = 0 ; k < containers.length; ++k) {
|
|
||||||
if (containers[k].getPath().equals(container.getPath())) {
|
|
||||||
foundContainer = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!foundContainer) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// remove the element info caching.
|
|
||||||
if (celement instanceof IOpenable) {
|
|
||||||
try {
|
try {
|
||||||
((IOpenable)celement).close();
|
op.runOperation(monitor);
|
||||||
// Make sure we clear the cache on the project too
|
|
||||||
if (!(celement instanceof ICProject)) {
|
|
||||||
celement.getCProject().close();
|
|
||||||
}
|
|
||||||
} catch (CModelException e) {
|
} catch (CModelException e) {
|
||||||
// ignore.
|
//
|
||||||
}
|
|
||||||
}
|
|
||||||
int flag =0;
|
|
||||||
if (event.isIncludeChange()) {
|
|
||||||
flag |= ICElementDelta.F_CHANGED_PATHENTRY_INCLUDE;
|
|
||||||
}
|
|
||||||
if (event.isMacroChange()) {
|
|
||||||
flag |= ICElementDelta.F_CHANGED_PATHENTRY_MACRO;
|
|
||||||
}
|
|
||||||
CElementDelta delta = new CElementDelta(celement.getCModel());
|
|
||||||
delta.changed(celement, flag);
|
|
||||||
list.add(delta);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (list.size() > 0) {
|
|
||||||
final ICElementDelta[] deltas = new ICElementDelta[list.size()];
|
|
||||||
list.toArray(deltas);
|
|
||||||
try {
|
|
||||||
CoreModel.run(new IWorkspaceRunnable() {
|
|
||||||
|
|
||||||
public void run(IProgressMonitor progressMonitor) throws CoreException {
|
|
||||||
CModelManager manager = CModelManager.getDefault();
|
|
||||||
for (int i = 0; i < deltas.length; i++) {
|
|
||||||
manager.registerCModelDelta(deltas[i]);
|
|
||||||
}
|
|
||||||
manager.fire(ElementChangedEvent.POST_CHANGE);
|
|
||||||
}
|
|
||||||
}, monitor);
|
|
||||||
} catch (CoreException e) {
|
|
||||||
// log the error.
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1301,24 +1160,15 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
|
||||||
}
|
}
|
||||||
|
|
||||||
CModelManager manager = CModelManager.getDefault();
|
CModelManager manager = CModelManager.getDefault();
|
||||||
ICProject cproject = manager.create(project);
|
final ICProject cproject = manager.create(project);
|
||||||
if (event.hasClosed()) {
|
if (event.hasClosed()) {
|
||||||
setPathEntryStore(project, null);
|
setPathEntryStore(project, null);
|
||||||
containerRemove(cproject);
|
containerRemove(cproject);
|
||||||
}
|
}
|
||||||
if (project.isAccessible()) {
|
if (project.isAccessible()) {
|
||||||
try {
|
try {
|
||||||
// Clear the old cache entries.
|
CModelOperation op = new PathEntryStoreChangedOperation(cproject);
|
||||||
IPathEntry[] oldResolvedEntries = removeCachedResolvedPathEntries(cproject);
|
op.runOperation(null);
|
||||||
IPathEntry[] newResolvedEntries = getResolvedPathEntries(cproject);
|
|
||||||
ICElementDelta[] deltas = generatePathEntryDeltas(cproject, oldResolvedEntries, newResolvedEntries);
|
|
||||||
if (deltas.length > 0) {
|
|
||||||
cproject.close();
|
|
||||||
for (int i = 0; i < deltas.length; i++) {
|
|
||||||
manager.registerCModelDelta(deltas[i]);
|
|
||||||
}
|
|
||||||
manager.fire(ElementChangedEvent.POST_CHANGE);
|
|
||||||
}
|
|
||||||
} catch (CModelException e) {
|
} catch (CModelException e) {
|
||||||
CCorePlugin.log(e);
|
CCorePlugin.log(e);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2005 QnX Software Systems and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Qnx Software Systems - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.internal.core.model;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.model.CModelException;
|
||||||
|
import org.eclipse.cdt.core.model.ICElementDelta;
|
||||||
|
import org.eclipse.cdt.core.model.ICProject;
|
||||||
|
import org.eclipse.cdt.core.model.IPathEntry;
|
||||||
|
|
||||||
|
public class PathEntryStoreChangedOperation extends CModelOperation {
|
||||||
|
|
||||||
|
public PathEntryStoreChangedOperation(ICProject cproject) {
|
||||||
|
super(cproject);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void executeOperation() throws CModelException {
|
||||||
|
PathEntryManager manager = PathEntryManager.getDefault();
|
||||||
|
ICProject cproject = (ICProject)getElementToProcess();
|
||||||
|
// Clear the old cache entries.
|
||||||
|
IPathEntry[] oldResolvedEntries = manager.removeCachedResolvedPathEntries(cproject);
|
||||||
|
IPathEntry[] newResolvedEntries = manager.getResolvedPathEntries(cproject);
|
||||||
|
ICElementDelta[] deltas = manager.generatePathEntryDeltas(cproject, oldResolvedEntries, newResolvedEntries);
|
||||||
|
if (deltas.length > 0) {
|
||||||
|
cproject.close();
|
||||||
|
for (int i = 0; i < deltas.length; i++) {
|
||||||
|
addDelta(deltas[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,116 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2005 QnX Software Systems and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Qnx Software Systems - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.internal.core.model;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.model.CModelException;
|
||||||
|
import org.eclipse.cdt.core.model.ICElementDelta;
|
||||||
|
import org.eclipse.cdt.core.model.ICProject;
|
||||||
|
import org.eclipse.cdt.core.model.IContainerEntry;
|
||||||
|
import org.eclipse.cdt.core.model.IPathEntry;
|
||||||
|
import org.eclipse.cdt.core.model.IPathEntryContainer;
|
||||||
|
import org.eclipse.core.runtime.IPath;
|
||||||
|
import org.eclipse.core.runtime.Path;
|
||||||
|
|
||||||
|
public class SetPathEntryContainerOperation extends CModelOperation {
|
||||||
|
|
||||||
|
IPathEntryContainer newContainer;
|
||||||
|
ICProject[] affectedProjects;
|
||||||
|
PathEntryManager fPathEntryManager;
|
||||||
|
|
||||||
|
public SetPathEntryContainerOperation(ICProject[] affectedProjects, IPathEntryContainer newContainer) {
|
||||||
|
super(affectedProjects);
|
||||||
|
this.affectedProjects = affectedProjects;
|
||||||
|
this.newContainer = newContainer;
|
||||||
|
fPathEntryManager = PathEntryManager.getDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void executeOperation() throws CModelException {
|
||||||
|
if (isCanceled()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
IPath containerPath = (newContainer == null) ? new Path("") : newContainer.getPath(); //$NON-NLS-1$
|
||||||
|
final int projectLength = affectedProjects.length;
|
||||||
|
final ICProject[] modifiedProjects = new ICProject[projectLength];
|
||||||
|
System.arraycopy(affectedProjects, 0, modifiedProjects, 0, projectLength);
|
||||||
|
final IPathEntry[][] oldResolvedEntries = new IPathEntry[projectLength][];
|
||||||
|
// filter out unmodified project containers
|
||||||
|
int remaining = 0;
|
||||||
|
for (int i = 0; i < projectLength; i++) {
|
||||||
|
if (isCanceled()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ICProject affectedProject = affectedProjects[i];
|
||||||
|
boolean found = false;
|
||||||
|
IPathEntry[] rawPath = fPathEntryManager.getRawPathEntries(affectedProject);
|
||||||
|
for (int j = 0, cpLength = rawPath.length; j < cpLength; j++) {
|
||||||
|
IPathEntry entry = rawPath[j];
|
||||||
|
if (entry.getEntryKind() == IPathEntry.CDT_CONTAINER) {
|
||||||
|
IContainerEntry cont = (IContainerEntry)entry;
|
||||||
|
if (cont.getPath().equals(containerPath)) {
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!found) {
|
||||||
|
// filter out this project - does not reference the container
|
||||||
|
// path
|
||||||
|
modifiedProjects[i] = null;
|
||||||
|
// Still add it to the cache
|
||||||
|
fPathEntryManager.containerPut(affectedProject, containerPath, newContainer);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
IPathEntryContainer oldContainer = fPathEntryManager.containerGet(affectedProject, containerPath, true);
|
||||||
|
if (oldContainer != null && newContainer != null && oldContainer.equals(newContainer)) {
|
||||||
|
modifiedProjects[i] = null; // filter out this project -
|
||||||
|
// container did not change
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
remaining++;
|
||||||
|
oldResolvedEntries[i] = fPathEntryManager.removeCachedResolvedPathEntries(affectedProject);
|
||||||
|
fPathEntryManager.containerPut(affectedProject, containerPath, newContainer);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Nothing change.
|
||||||
|
if (remaining == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// trigger model refresh
|
||||||
|
|
||||||
|
CModelManager mgr = CModelManager.getDefault();
|
||||||
|
for (int i = 0; i < projectLength; i++) {
|
||||||
|
if (isCanceled()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ICProject affectedProject = modifiedProjects[i];
|
||||||
|
if (affectedProject == null) {
|
||||||
|
continue; // was filtered out
|
||||||
|
}
|
||||||
|
// Only fire deltas if we had previous cache
|
||||||
|
if (oldResolvedEntries[i] != null) {
|
||||||
|
IPathEntry[] newEntries = fPathEntryManager.getResolvedPathEntries(affectedProject);
|
||||||
|
ICElementDelta[] deltas = fPathEntryManager.generatePathEntryDeltas(affectedProject, oldResolvedEntries[i], newEntries);
|
||||||
|
if (deltas.length > 0) {
|
||||||
|
affectedProject.close();
|
||||||
|
//shouldFire = true;
|
||||||
|
for (int j = 0; j < deltas.length; j++) {
|
||||||
|
addDelta(deltas[j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -71,7 +71,7 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
|
||||||
if (sibling != null) {
|
if (sibling != null) {
|
||||||
op.createBefore(sibling);
|
op.createBefore(sibling);
|
||||||
}
|
}
|
||||||
CModelManager.getDefault().runOperation(op, monitor);
|
op.runOperation(monitor);
|
||||||
return getInclude(includeName);
|
return getInclude(includeName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -80,7 +80,7 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
|
||||||
if (sibling != null) {
|
if (sibling != null) {
|
||||||
op.createBefore(sibling);
|
op.createBefore(sibling);
|
||||||
}
|
}
|
||||||
CModelManager.getDefault().runOperation(op, monitor);
|
op.runOperation(monitor);
|
||||||
return getUsing(usingName);
|
return getUsing(usingName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,7 +89,7 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
|
||||||
if (sibling != null) {
|
if (sibling != null) {
|
||||||
op.createBefore(sibling);
|
op.createBefore(sibling);
|
||||||
}
|
}
|
||||||
CModelManager.getDefault().runOperation(op, monitor);
|
op.runOperation(monitor);
|
||||||
return getNamespace(namespace);
|
return getNamespace(namespace);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -465,7 +465,7 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
|
||||||
return workingCopy;
|
return workingCopy;
|
||||||
}
|
}
|
||||||
CreateWorkingCopyOperation op = new CreateWorkingCopyOperation(this, perFactoryWorkingCopies, factory, requestor);
|
CreateWorkingCopyOperation op = new CreateWorkingCopyOperation(this, perFactoryWorkingCopies, factory, requestor);
|
||||||
runOperation(op, monitor);
|
op.runOperation(monitor);
|
||||||
return (IWorkingCopy)op.getResultElements()[0];
|
return (IWorkingCopy)op.getResultElements()[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -83,7 +83,7 @@ public class WorkingCopy extends TranslationUnit implements IWorkingCopy {
|
||||||
ITranslationUnit original = this.getOriginalElement();
|
ITranslationUnit original = this.getOriginalElement();
|
||||||
if (original.exists()) {
|
if (original.exists()) {
|
||||||
CommitWorkingCopyOperation op= new CommitWorkingCopyOperation(this, force);
|
CommitWorkingCopyOperation op= new CommitWorkingCopyOperation(this, force);
|
||||||
runOperation(op, monitor);
|
op.runOperation(monitor);
|
||||||
} else {
|
} else {
|
||||||
String contents = this.getSource();
|
String contents = this.getSource();
|
||||||
if (contents == null) return;
|
if (contents == null) return;
|
||||||
|
@ -135,7 +135,7 @@ public class WorkingCopy extends TranslationUnit implements IWorkingCopy {
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
DestroyWorkingCopyOperation op = new DestroyWorkingCopyOperation(this);
|
DestroyWorkingCopyOperation op = new DestroyWorkingCopyOperation(this);
|
||||||
runOperation(op, null);
|
op.runOperation(null);
|
||||||
} catch (CModelException e) {
|
} catch (CModelException e) {
|
||||||
// do nothing
|
// do nothing
|
||||||
}
|
}
|
||||||
|
@ -356,7 +356,7 @@ public class WorkingCopy extends TranslationUnit implements IWorkingCopy {
|
||||||
if (this.useCount == 0) throw newNotPresentException(); //was destroyed
|
if (this.useCount == 0) throw newNotPresentException(); //was destroyed
|
||||||
|
|
||||||
ReconcileWorkingCopyOperation op = new ReconcileWorkingCopyOperation(this, forceProblemDetection);
|
ReconcileWorkingCopyOperation op = new ReconcileWorkingCopyOperation(this, forceProblemDetection);
|
||||||
runOperation(op, monitor);
|
op.runOperation(monitor);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -179,8 +179,9 @@ public class MachO {
|
||||||
sizeofcmds = makeInt(bytes, offset, isle); offset += 4;
|
sizeofcmds = makeInt(bytes, offset, isle); offset += 4;
|
||||||
flags = makeInt(bytes, offset, isle); offset += 4;
|
flags = makeInt(bytes, offset, isle); offset += 4;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private final short makeShort(byte [] val, int offset, boolean isle) throws IOException {
|
private static final short makeShort(byte [] val, int offset, boolean isle) throws IOException {
|
||||||
if (val.length < offset + 2)
|
if (val.length < offset + 2)
|
||||||
throw new IOException();
|
throw new IOException();
|
||||||
if ( isle ) {
|
if ( isle ) {
|
||||||
|
@ -189,7 +190,7 @@ public class MachO {
|
||||||
return (short)(((val[offset + 0] & 0xff) << 8) + (val[offset + 1] & 0xff));
|
return (short)(((val[offset + 0] & 0xff) << 8) + (val[offset + 1] & 0xff));
|
||||||
}
|
}
|
||||||
|
|
||||||
private final int makeInt(byte [] val, int offset, boolean isle) throws IOException
|
private static final int makeInt(byte [] val, int offset, boolean isle) throws IOException
|
||||||
{
|
{
|
||||||
if (val.length < offset + 4)
|
if (val.length < offset + 4)
|
||||||
throw new IOException();
|
throw new IOException();
|
||||||
|
@ -206,8 +207,6 @@ public class MachO {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public class LoadCommand {
|
public class LoadCommand {
|
||||||
public final static int LC_REQ_DYLD = 0x80000000;
|
public final static int LC_REQ_DYLD = 0x80000000;
|
||||||
|
|
||||||
|
@ -1029,10 +1028,12 @@ public class MachO {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isMachOHeader(byte[] bytes) {
|
public static boolean isMachOHeader(byte[] bytes) {
|
||||||
boolean isle = false;
|
try {
|
||||||
int offset = 0;
|
int magic = makeInt(bytes, 0, false);
|
||||||
int magic = (bytes[0] << 24) + (bytes[1] << 16) + (bytes[2] << 8) + bytes[3];
|
|
||||||
return (magic == MachO.MachOhdr.MH_MAGIC || magic == MachO.MachOhdr.MH_CIGAM);
|
return (magic == MachO.MachOhdr.MH_MAGIC || magic == MachO.MachOhdr.MH_CIGAM);
|
||||||
|
} catch (IOException e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void dispose() {
|
public void dispose() {
|
||||||
|
|
Loading…
Add table
Reference in a new issue