1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-25 01:45:33 +02:00

improved binaryconfig use

This commit is contained in:
David Inglis 2004-10-14 20:08:28 +00:00
parent a17fa3fe67
commit d9ad522e13
7 changed files with 197 additions and 179 deletions

View file

@ -1,3 +1,18 @@
2004-10-14 David Inglis
Move BinaryConfig into internal.model was no need to be public, also fixed it to
be lazy when creating parser interface.
* model/org/eclipse/cdt/internal/core/model/CModelManager.java
* model/org/eclipse/cdt/internal/core/model/CProject.java
* src/org/eclipse/cdt/core/BinaryParserConfig.java
* src/org/eclipse/cdt/core/CCorePlugin.java
* src/org/eclipse/cdt/core/ICExtensionReference.java
* src/org/eclipse/cdt/internal/core/CExtensionReference.java
Removed
* model/org/eclipse/cdt/internal/core/model/BinaryParserConfig.java
2004-10-12 Vladimir Hirsl 2004-10-12 Vladimir Hirsl
Fix for PR 69604 [Templates] Instantiating template with deferred template instance Fix for PR 69604 [Templates] Instantiating template with deferred template instance

View file

@ -8,26 +8,39 @@
* Contributors: * Contributors:
* QNX Software Systems - Initial API and implementation * QNX Software Systems - Initial API and implementation
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.core; package org.eclipse.cdt.internal.core.model;
import org.eclipse.cdt.core.IBinaryParser;
import org.eclipse.cdt.core.ICExtensionReference;
import org.eclipse.core.runtime.CoreException;
/* /*
* BinaryParserConfig * BinaryParserConfig
*/ */
public class BinaryParserConfig { public class BinaryParserConfig {
private IBinaryParser parser;
IBinaryParser parser; private final String id;
String id; private final ICExtensionReference ref;
public BinaryParserConfig(IBinaryParser parser, String id) { public BinaryParserConfig(IBinaryParser parser, String id) {
this.parser = parser; this.parser = parser;
this.id = id; this.id = id;
this.ref = null;
}
public BinaryParserConfig(ICExtensionReference ref) {
this.ref = ref;
this.id = ref.getID();
} }
public String getId() { public String getId() {
return id; return id;
} }
public IBinaryParser getBinaryParser() { public IBinaryParser getBinaryParser() throws CoreException {
if (parser == null) {
parser = (IBinaryParser)ref.createExtension();
}
return parser; return parser;
} }
} }

View file

@ -17,7 +17,6 @@ import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.eclipse.cdt.core.BinaryParserConfig;
import org.eclipse.cdt.core.CCProjectNature; import org.eclipse.cdt.core.CCProjectNature;
import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.CDescriptorEvent; import org.eclipse.cdt.core.CDescriptorEvent;
@ -25,6 +24,7 @@ import org.eclipse.cdt.core.CProjectNature;
import org.eclipse.cdt.core.IBinaryParser; import org.eclipse.cdt.core.IBinaryParser;
import org.eclipse.cdt.core.ICDescriptor; import org.eclipse.cdt.core.ICDescriptor;
import org.eclipse.cdt.core.ICDescriptorListener; import org.eclipse.cdt.core.ICDescriptorListener;
import org.eclipse.cdt.core.ICExtensionReference;
import org.eclipse.cdt.core.IBinaryParser.IBinaryArchive; import org.eclipse.cdt.core.IBinaryParser.IBinaryArchive;
import org.eclipse.cdt.core.IBinaryParser.IBinaryFile; import org.eclipse.cdt.core.IBinaryParser.IBinaryFile;
import org.eclipse.cdt.core.IBinaryParser.IBinaryObject; import org.eclipse.cdt.core.IBinaryParser.IBinaryObject;
@ -114,9 +114,9 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
protected Map elementsOutOfSynchWithBuffers = new HashMap(11); protected Map elementsOutOfSynchWithBuffers = new HashMap(11);
/* /*
* Temporary cache of newly opened elements * Temporary cache of newly opened elements
*/ */
private ThreadLocal temporaryCache = new ThreadLocal(); private ThreadLocal temporaryCache = new ThreadLocal();
/** /**
* Infos cache. * Infos cache.
@ -156,9 +156,9 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
// Register to the workspace; // Register to the workspace;
ResourcesPlugin.getWorkspace().addResourceChangeListener(factory, ResourcesPlugin.getWorkspace().addResourceChangeListener(factory,
IResourceChangeEvent.POST_CHANGE IResourceChangeEvent.POST_CHANGE
| IResourceChangeEvent.PRE_DELETE | IResourceChangeEvent.PRE_DELETE
| IResourceChangeEvent.PRE_CLOSE); | IResourceChangeEvent.PRE_CLOSE);
// Register the Core Model on the Descriptor // Register the Core Model on the Descriptor
// Manager, it needs to know about changes. // Manager, it needs to know about changes.
@ -182,7 +182,7 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
return cModel; return cModel;
} }
public ICElement create (IPath path) { public ICElement create(IPath path) {
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
// Assume it is fullpath relative to workspace // Assume it is fullpath relative to workspace
IResource res = root.findMember(path); IResource res = root.findMember(path);
@ -203,7 +203,7 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
return create(res, null); return create(res, null);
} }
public ICElement create (IResource resource, ICProject cproject) { public ICElement create(IResource resource, ICProject cproject) {
if (resource == null) { if (resource == null) {
return null; return null;
} }
@ -429,7 +429,7 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
if (celement == null) if (celement == null)
return; return;
//System.out.println("RELEASE " + celement.getElementName()); //System.out.println("RELEASE " + celement.getElementName());
// Remove from the containers. // Remove from the containers.
if (celement instanceof IParent) { if (celement instanceof IParent) {
@ -505,30 +505,50 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
} }
public BinaryParserConfig[] getBinaryParser(IProject project) { public BinaryParserConfig[] getBinaryParser(IProject project) {
try { BinaryParserConfig[] parsers = (BinaryParserConfig[])binaryParsersMap.get(project);
BinaryParserConfig[] parsers = (BinaryParserConfig[])binaryParsersMap.get(project); if (parsers == null) {
try {
ICDescriptor cdesc = CCorePlugin.getDefault().getCProjectDescription(project, false);
if (cdesc != null) {
ICExtensionReference[] cextensions = cdesc.get(CCorePlugin.BINARY_PARSER_UNIQ_ID, true);
if (cextensions.length > 0) {
ArrayList list = new ArrayList(cextensions.length);
for (int i = 0; i < cextensions.length; i++) {
BinaryParserConfig config = new BinaryParserConfig(cextensions[i]);
list.add(config);
}
parsers = new BinaryParserConfig[list.size()];
list.toArray(parsers);
}
}
} catch (CoreException e) {
}
if (parsers == null) { if (parsers == null) {
parsers = CCorePlugin.getDefault().getBinaryParserConfigs(project); try {
BinaryParserConfig config = new BinaryParserConfig(CCorePlugin.getDefault().getDefaultBinaryParser(), CCorePlugin.DEFAULT_BINARY_PARSER_UNIQ_ID);
parsers = new BinaryParserConfig[]{config};
} catch (CoreException e1) {
}
} }
if (parsers != null) {
binaryParsersMap.put(project, parsers);
return parsers;
}
} catch (CoreException e) {
} }
IBinaryParser nullParser = new NullBinaryParser(); if (parsers != null) {
BinaryParserConfig config = new BinaryParserConfig(nullParser, ""); //$NON-NLS-1$ binaryParsersMap.put(project, parsers);
BinaryParserConfig[] configs = new BinaryParserConfig[] {config}; return parsers;
return configs; }
return new BinaryParserConfig[0];
} }
public IBinaryFile createBinaryFile(IFile file) { public IBinaryFile createBinaryFile(IFile file) {
BinaryParserConfig[] parsers = getBinaryParser(file.getProject()); BinaryParserConfig[] parsers = getBinaryParser(file.getProject());
int hints = 0; int hints = 0;
for (int i = 0; i < parsers.length; i++) { for (int i = 0; i < parsers.length; i++) {
IBinaryParser parser = parsers[i].getBinaryParser(); IBinaryParser parser = null;
if (parser.getHintBufferSize() > hints) { try {
hints = parser.getHintBufferSize(); parser = parsers[i].getBinaryParser();
if (parser.getHintBufferSize() > hints) {
hints = parser.getHintBufferSize();
}
} catch (CoreException e) {
} }
} }
byte[] bytes = new byte[hints]; byte[] bytes = new byte[hints];
@ -553,17 +573,17 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
for (int i = 0; i < parsers.length; i++) { for (int i = 0; i < parsers.length; i++) {
try { try {
IBinaryFile bin = parsers[i].getBinaryParser().getBinary(bytes, location); IBinaryParser parser = parsers[i].getBinaryParser();
if (bin != null) { IBinaryFile binFile = parser.getBinary(bytes, location);
return bin; if (binFile != null) {
return binFile;
} }
} catch (IOException e) { } catch (IOException e) {
// } catch (CoreException e) {
} }
} }
return null; return null;
} }
/** /**
* TODO: this is a temporary hack until, the CDescriptor manager is * TODO: this is a temporary hack until, the CDescriptor manager is
* in place and could fire deltas of Parser change. * in place and could fire deltas of Parser change.
@ -593,7 +613,7 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
public BinaryRunner getBinaryRunner(ICProject project, boolean start) { 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());
@ -611,7 +631,7 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
} }
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) {
runner.stop(); runner.stop();
} }
@ -619,8 +639,8 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
public SourceMapper getSourceMapper(ICProject cProject) { public SourceMapper getSourceMapper(ICProject cProject) {
SourceMapper mapper = null; SourceMapper mapper = null;
synchronized(sourceMappers) { synchronized (sourceMappers) {
mapper = (SourceMapper) sourceMappers.get(cProject); mapper = (SourceMapper)sourceMappers.get(cProject);
if (mapper == null) { if (mapper == null) {
mapper = new SourceMapper(cProject); mapper = new SourceMapper(cProject);
sourceMappers.put(cProject, mapper); sourceMappers.put(cProject, mapper);
@ -632,7 +652,7 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
* addElementChangedListener method comment. * addElementChangedListener method comment.
*/ */
public void addElementChangedListener(IElementChangedListener listener) { public void addElementChangedListener(IElementChangedListener listener) {
synchronized(fElementChangedListeners) { synchronized (fElementChangedListeners) {
if (!fElementChangedListeners.contains(listener)) { if (!fElementChangedListeners.contains(listener)) {
fElementChangedListeners.add(listener); fElementChangedListeners.add(listener);
} }
@ -643,7 +663,7 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
* removeElementChangedListener method comment. * removeElementChangedListener method comment.
*/ */
public void removeElementChangedListener(IElementChangedListener listener) { public void removeElementChangedListener(IElementChangedListener listener) {
synchronized(fElementChangedListeners) { synchronized (fElementChangedListeners) {
int i = fElementChangedListeners.indexOf(listener); int i = fElementChangedListeners.indexOf(listener);
if (i != -1) { if (i != -1) {
fElementChangedListeners.remove(i); fElementChangedListeners.remove(i);
@ -675,23 +695,23 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
if (event.getSource() instanceof IWorkspace) { if (event.getSource() instanceof IWorkspace) {
IResourceDelta delta = event.getDelta(); IResourceDelta delta = event.getDelta();
IResource resource = event.getResource(); IResource resource = event.getResource();
switch(event.getType()){ switch (event.getType()) {
case IResourceChangeEvent.PRE_DELETE : case IResourceChangeEvent.PRE_DELETE :
try{ try {
if (resource.getType() == IResource.PROJECT && if (resource.getType() == IResource.PROJECT &&
( ((IProject)resource).hasNature(CProjectNature.C_NATURE_ID) || ( ((IProject)resource).hasNature(CProjectNature.C_NATURE_ID) ||
((IProject)resource).hasNature(CCProjectNature.CC_NATURE_ID) )){ ((IProject)resource).hasNature(CCProjectNature.CC_NATURE_ID) )){
this.deleting((IProject) resource);} this.deleting((IProject) resource);}
}catch (CoreException e){ } catch (CoreException e) {
} }
break; break;
case IResourceChangeEvent.POST_CHANGE : case IResourceChangeEvent.POST_CHANGE :
try { try {
if (delta != null) { if (delta != null) {
ICElementDelta[] translatedDeltas = fDeltaProcessor.processResourceDelta(delta); ICElementDelta[] translatedDeltas = fDeltaProcessor.processResourceDelta(delta);
if (translatedDeltas.length > 0) { if (translatedDeltas.length > 0) {
for (int i= 0; i < translatedDeltas.length; i++) { for (int i = 0; i < translatedDeltas.length; i++) {
registerCModelDelta(translatedDeltas[i]); registerCModelDelta(translatedDeltas[i]);
} }
} }
@ -700,7 +720,7 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
break; break;
} }
} }
} }
@ -710,27 +730,26 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
*/ */
public void descriptorChanged(CDescriptorEvent event) { public void descriptorChanged(CDescriptorEvent event) {
int flags = event.getFlags(); int flags = event.getFlags();
if ((flags & CDescriptorEvent.EXTENSION_CHANGED) != 0) { if ( (flags & CDescriptorEvent.EXTENSION_CHANGED) != 0) {
ICDescriptor cdesc = event.getDescriptor(); ICDescriptor cdesc = event.getDescriptor();
if (cdesc != null) { if (cdesc != null) {
IProject project = cdesc.getProject(); IProject project = cdesc.getProject();
try { try {
String[] newIds = CCorePlugin.getDefault().getBinaryParserIds(project); ICExtensionReference[] newExts = CCorePlugin.getDefault().getBinaryParserExtensions(project);
BinaryParserConfig[] currentConfigs = getBinaryParser(project); BinaryParserConfig[] currentConfigs = getBinaryParser(project);
// anything added/removed // anything added/removed
if (newIds.length != currentConfigs.length) { if (newExts.length != currentConfigs.length) {
resetBinaryParser(project); resetBinaryParser(project);
} else { // may reorder } else { // may reorder
for (int i = 0; i < newIds.length; i++) { for (int i = 0; i < newExts.length; i++) {
String id = newIds[i]; if (!newExts[i].getID().equals(currentConfigs[i].getId())) {
if (!id.equals(currentConfigs[i].getId())) {
resetBinaryParser(project); resetBinaryParser(project);
break; break;
} }
} }
} }
} catch (CoreException e) { } catch (CoreException e) {
// resetBinaryParser(project);
} }
} }
} }
@ -762,29 +781,29 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
IElementChangedListener[] listeners; IElementChangedListener[] listeners;
int listenerCount; int listenerCount;
int [] listenerMask; int[] listenerMask;
// Notification // Notification
synchronized(fElementChangedListeners) { synchronized (fElementChangedListeners) {
listeners = new IElementChangedListener[fElementChangedListeners.size()]; listeners = new IElementChangedListener[fElementChangedListeners.size()];
fElementChangedListeners.toArray(listeners); fElementChangedListeners.toArray(listeners);
listenerCount = listeners.length; listenerCount = listeners.length;
listenerMask = null; listenerMask = null;
} }
switch (eventType) { switch (eventType) {
case DEFAULT_CHANGE_EVENT: case DEFAULT_CHANGE_EVENT :
firePreAutoBuildDelta(deltaToNotify, listeners, listenerMask, listenerCount); firePreAutoBuildDelta(deltaToNotify, listeners, listenerMask, listenerCount);
firePostChangeDelta(deltaToNotify, listeners, listenerMask, listenerCount); firePostChangeDelta(deltaToNotify, listeners, listenerMask, listenerCount);
fireReconcileDelta(listeners, listenerMask, listenerCount); fireReconcileDelta(listeners, listenerMask, listenerCount);
break; break;
case ElementChangedEvent.PRE_AUTO_BUILD: case ElementChangedEvent.PRE_AUTO_BUILD :
firePreAutoBuildDelta(deltaToNotify, listeners, listenerMask, listenerCount); firePreAutoBuildDelta(deltaToNotify, listeners, listenerMask, listenerCount);
break; break;
case ElementChangedEvent.POST_CHANGE: case ElementChangedEvent.POST_CHANGE :
firePostChangeDelta(deltaToNotify, listeners, listenerMask, listenerCount); firePostChangeDelta(deltaToNotify, listeners, listenerMask, listenerCount);
fireReconcileDelta(listeners, listenerMask, listenerCount); fireReconcileDelta(listeners, listenerMask, listenerCount);
break; break;
case ElementChangedEvent.POST_RECONCILE: case ElementChangedEvent.POST_RECONCILE :
fireReconcileDelta(listeners, listenerMask, listenerCount); fireReconcileDelta(listeners, listenerMask, listenerCount);
break; break;
} }
@ -795,7 +814,7 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
IElementChangedListener[] listeners, int[] listenerMask, int listenerCount) { IElementChangedListener[] listeners, int[] listenerMask, int listenerCount) {
if (VERBOSE) { if (VERBOSE) {
System.out.println("FIRING PRE_AUTO_BUILD Delta ["+Thread.currentThread()+"]:"); //$NON-NLS-1$//$NON-NLS-2$ System.out.println("FIRING PRE_AUTO_BUILD Delta [" + Thread.currentThread() + "]:"); //$NON-NLS-1$//$NON-NLS-2$
System.out.println(deltaToNotify == null ? "<NONE>" : deltaToNotify.toString()); //$NON-NLS-1$ System.out.println(deltaToNotify == null ? "<NONE>" : deltaToNotify.toString()); //$NON-NLS-1$
} }
if (deltaToNotify != null) { if (deltaToNotify != null) {
@ -806,21 +825,21 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
private void firePostChangeDelta(ICElementDelta deltaToNotify, IElementChangedListener[] listeners, int[] listenerMask, int listenerCount) { private void firePostChangeDelta(ICElementDelta deltaToNotify, IElementChangedListener[] listeners, int[] listenerMask, int listenerCount) {
// post change deltas // post change deltas
if (VERBOSE){ if (VERBOSE) {
System.out.println("FIRING POST_CHANGE Delta ["+Thread.currentThread()+"]:"); //$NON-NLS-1$//$NON-NLS-2$ System.out.println("FIRING POST_CHANGE Delta [" + Thread.currentThread() + "]:"); //$NON-NLS-1$//$NON-NLS-2$
System.out.println(deltaToNotify == null ? "<NONE>" : deltaToNotify.toString()); //$NON-NLS-1$ System.out.println(deltaToNotify == null ? "<NONE>" : deltaToNotify.toString()); //$NON-NLS-1$
} }
if (deltaToNotify != null) { if (deltaToNotify != null) {
// flush now so as to keep listener reactions to post their own deltas for subsequent iteration // flush now so as to keep listener reactions to post their own deltas for subsequent iteration
this.flush(); this.flush();
notifyListeners(deltaToNotify, ElementChangedEvent.POST_CHANGE, listeners, listenerMask, listenerCount); notifyListeners(deltaToNotify, ElementChangedEvent.POST_CHANGE, listeners, listenerMask, listenerCount);
} }
} }
private void fireReconcileDelta(IElementChangedListener[] listeners, int[] listenerMask, int listenerCount) { private void fireReconcileDelta(IElementChangedListener[] listeners, int[] listenerMask, int listenerCount) {
ICElementDelta deltaToNotify = mergeDeltas(this.reconcileDeltas.values()); ICElementDelta deltaToNotify = mergeDeltas(this.reconcileDeltas.values());
if (VERBOSE){ if (VERBOSE) {
System.out.println("FIRING POST_RECONCILE Delta ["+Thread.currentThread()+"]:"); //$NON-NLS-1$//$NON-NLS-2$ System.out.println("FIRING POST_RECONCILE Delta [" + Thread.currentThread() + "]:"); //$NON-NLS-1$//$NON-NLS-2$
System.out.println(deltaToNotify == null ? "<NONE>" : deltaToNotify.toString()); //$NON-NLS-1$ System.out.println(deltaToNotify == null ? "<NONE>" : deltaToNotify.toString()); //$NON-NLS-1$
} }
if (deltaToNotify != null) { if (deltaToNotify != null) {
@ -834,16 +853,17 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
IElementChangedListener[] listeners, int[] listenerMask, int listenerCount) { IElementChangedListener[] listeners, int[] listenerMask, int listenerCount) {
final ElementChangedEvent extraEvent = new ElementChangedEvent(deltaToNotify, eventType); final ElementChangedEvent extraEvent = new ElementChangedEvent(deltaToNotify, eventType);
for (int i= 0; i < listenerCount; i++) { for (int i = 0; i < listenerCount; i++) {
if (listenerMask == null || (listenerMask[i] & eventType) != 0) { if (listenerMask == null || (listenerMask[i] & eventType) != 0) {
final IElementChangedListener listener = listeners[i]; final IElementChangedListener listener = listeners[i];
long start = -1; long start = -1;
if (VERBOSE) { if (VERBOSE) {
System.out.print("Listener #" + (i+1) + "=" + listener.toString());//$NON-NLS-1$//$NON-NLS-2$ System.out.print("Listener #" + (i + 1) + "=" + listener.toString());//$NON-NLS-1$//$NON-NLS-2$
start = System.currentTimeMillis(); start = System.currentTimeMillis();
} }
// wrap callbacks with Safe runnable for subsequent listeners to be called when some are causing grief // wrap callbacks with Safe runnable for subsequent listeners to be called when some are causing grief
Platform.run(new ISafeRunnable() { Platform.run(new ISafeRunnable() {
public void handleException(Throwable exception) { public void handleException(Throwable exception) {
//CCorePlugin.log(exception, "Exception occurred in listener of C element change notification"); //$NON-NLS-1$ //CCorePlugin.log(exception, "Exception occurred in listener of C element change notification"); //$NON-NLS-1$
CCorePlugin.log(exception); CCorePlugin.log(exception);
@ -853,7 +873,7 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
} }
}); });
if (VERBOSE) { if (VERBOSE) {
System.out.println(" -> " + (System.currentTimeMillis()-start) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$ System.out.println(" -> " + (System.currentTimeMillis() - start) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
} }
} }
} }
@ -868,7 +888,7 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
private ICElementDelta mergeDeltas(Collection deltas) { private ICElementDelta mergeDeltas(Collection deltas) {
synchronized(deltas) { synchronized (deltas) {
if (deltas.size() == 0) if (deltas.size() == 0)
return null; return null;
if (deltas.size() == 1) if (deltas.size() == 1)
@ -886,7 +906,7 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
if (cRoot.equals(element)) { if (cRoot.equals(element)) {
ICElementDelta[] children = delta.getAffectedChildren(); ICElementDelta[] children = delta.getAffectedChildren();
for (int j = 0; j < children.length; j++) { for (int j = 0; j < children.length; j++) {
CElementDelta projectDelta = (CElementDelta) children[j]; CElementDelta projectDelta = (CElementDelta)children[j];
rootDelta.insertDeltaTree(projectDelta.getElement(), projectDelta); rootDelta.insertDeltaTree(projectDelta.getElement(), projectDelta);
insertedTree = true; insertedTree = true;
} }
@ -919,15 +939,15 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
if (ce instanceof CModelException) { if (ce instanceof CModelException) {
throw (CModelException)ce; throw (CModelException)ce;
} else if (ce.getStatus().getCode() == IResourceStatus.OPERATION_FAILED) { } else if (ce.getStatus().getCode() == IResourceStatus.OPERATION_FAILED) {
Throwable e= ce.getStatus().getException(); Throwable e = ce.getStatus().getException();
if (e instanceof CModelException) { if (e instanceof CModelException) {
throw (CModelException) e; throw (CModelException)e;
} }
} }
throw new CModelException(ce); throw new CModelException(ce);
} finally { } finally {
// fire only if there were no awaiting deltas (if there were, they would come from a resource modifying operation) // 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 // and the operation has not modified any resource
if (!hadAwaitingDeltas && !operation.hasModifiedResource()) { if (!hadAwaitingDeltas && !operation.hasModifiedResource()) {
fire(ElementChangedEvent.POST_CHANGE); fire(ElementChangedEvent.POST_CHANGE);
} // else deltas are fired while processing the resource delta } // else deltas are fired while processing the resource delta
@ -942,7 +962,7 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
} }
/** /**
* Returns the info for the element. * Returns the info for the element.
*/ */
public synchronized Object getInfo(ICElement element) { public synchronized Object getInfo(ICElement element) {
HashMap tempCache = (HashMap)this.temporaryCache.get(); HashMap tempCache = (HashMap)this.temporaryCache.get();
@ -983,7 +1003,7 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
if (openedElement instanceof IParent && existingInfo instanceof CElementInfo) { if (openedElement instanceof IParent && existingInfo instanceof CElementInfo) {
ICElement[] children = ((CElementInfo)existingInfo).getChildren(); ICElement[] children = ((CElementInfo)existingInfo).getChildren();
for (int i = 0, size = children.length; i < size; ++i) { for (int i = 0, size = children.length; i < size; ++i) {
CElement child = (CElement) children[i]; CElement child = (CElement)children[i];
try { try {
child.close(); child.close();
} catch (CModelException e) { } catch (CModelException e) {
@ -1010,7 +1030,7 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
if (openedElement instanceof IParent && existingInfo instanceof CElementInfo) { if (openedElement instanceof IParent && existingInfo instanceof CElementInfo) {
ICElement[] children = ((CElementInfo)existingInfo).getChildren(); ICElement[] children = ((CElementInfo)existingInfo).getChildren();
for (int i = 0, size = children.length; i < size; ++i) { for (int i = 0, size = children.length; i < size; ++i) {
CElement child = (CElement) children[i]; CElement child = (CElement)children[i];
try { try {
child.close(); child.close();
} catch (CModelException e) { } catch (CModelException e) {
@ -1087,7 +1107,7 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
return this.fDeltaProcessor.indexManager; return this.fDeltaProcessor.indexManager;
} }
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); removeBinaryRunner(project);

View file

@ -19,10 +19,10 @@ import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.eclipse.cdt.core.BinaryParserConfig;
import org.eclipse.cdt.core.CCProjectNature; import org.eclipse.cdt.core.CCProjectNature;
import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.CProjectNature; import org.eclipse.cdt.core.CProjectNature;
import org.eclipse.cdt.core.IBinaryParser;
import org.eclipse.cdt.core.IBinaryParser.IBinaryArchive; import org.eclipse.cdt.core.IBinaryParser.IBinaryArchive;
import org.eclipse.cdt.core.IBinaryParser.IBinaryFile; import org.eclipse.cdt.core.IBinaryParser.IBinaryFile;
import org.eclipse.cdt.core.IBinaryParser.IBinaryObject; import org.eclipse.cdt.core.IBinaryParser.IBinaryObject;
@ -202,7 +202,8 @@ public class CProject extends Openable implements ICProject {
for (int i = 0; i < binConfigs.length; i++) { for (int i = 0; i < binConfigs.length; i++) {
IBinaryFile bin; IBinaryFile bin;
try { try {
bin = binConfigs[i].getBinaryParser().getBinary(entry.getFullLibraryPath()); IBinaryParser parser = binConfigs[i].getBinaryParser();
bin = parser.getBinary(entry.getFullLibraryPath());
if (bin != null) { if (bin != null) {
if (bin.getType() == IBinaryFile.ARCHIVE) { if (bin.getType() == IBinaryFile.ARCHIVE) {
lib = new LibraryReferenceArchive(cproject, entry, (IBinaryArchive)bin); lib = new LibraryReferenceArchive(cproject, entry, (IBinaryArchive)bin);
@ -211,7 +212,8 @@ public class CProject extends Openable implements ICProject {
} }
break; break;
} }
} catch (IOException e1) { } catch (IOException e) {
} catch (CoreException e) {
} }
} }
} }

View file

@ -467,8 +467,8 @@ public class CCorePlugin extends Plugin {
return getConsole(null); return getConsole(null);
} }
public BinaryParserConfig[] getBinaryParserConfigs(IProject project) throws CoreException { public ICExtensionReference[] getBinaryParserExtensions(IProject project) throws CoreException {
BinaryParserConfig configs[] = null; ICExtensionReference ext[] = new ICExtensionReference[0];
if (project != null) { if (project != null) {
try { try {
ICDescriptor cdesc = getCProjectDescription(project); ICDescriptor cdesc = getCProjectDescription(project);
@ -476,57 +476,15 @@ public class CCorePlugin extends Plugin {
if (cextensions.length > 0) { if (cextensions.length > 0) {
ArrayList list = new ArrayList(cextensions.length); ArrayList list = new ArrayList(cextensions.length);
for (int i = 0; i < cextensions.length; i++) { for (int i = 0; i < cextensions.length; i++) {
IBinaryParser parser = null; list.add(cextensions[i]);
try {
parser = (IBinaryParser) cextensions[i].createExtension();
BinaryParserConfig config = new BinaryParserConfig(parser, cextensions[i].getID());
list.add(config);
} catch (CoreException e) {
Status s = new Status(IStatus.WARNING, PLUGIN_ID, -1, "Binary Parser failure", e); //$NON-NLS-1$
log(s);
} catch (ClassCastException e) {
log(e);
}
} }
configs = new BinaryParserConfig[list.size()]; ext = (ICExtensionReference[])list.toArray(ext);
list.toArray(configs);
}
} catch (CoreException e) {
// ignore
}
}
if (configs == null) {
IBinaryParser parser = getDefaultBinaryParser();
if (parser != null) {
BinaryParserConfig config = new BinaryParserConfig(parser, DEFAULT_BINARY_PARSER_UNIQ_ID);
configs = new BinaryParserConfig[] {config};
}
}
return configs;
}
public String[] getBinaryParserIds(IProject project) throws CoreException {
String ids[] = null;
if (project != null) {
try {
ICDescriptor cdesc = getCProjectDescription(project);
ICExtensionReference[] cextensions = cdesc.get(BINARY_PARSER_UNIQ_ID, true);
if (cextensions.length > 0) {
ArrayList list = new ArrayList(cextensions.length);
for (int i = 0; i < cextensions.length; i++) {
list.add(cextensions[i].getID());
}
ids = new String[list.size()];
list.toArray(ids);
} }
} catch (CoreException e) { } catch (CoreException e) {
log(e); log(e);
} }
} }
if (ids == null) { return ext;
ids = new String[] {DEFAULT_BINARY_PARSER_UNIQ_ID};
}
return ids;
} }
public IBinaryParser[] getBinaryParser(IProject project) throws CoreException { public IBinaryParser[] getBinaryParser(IProject project) throws CoreException {

View file

@ -12,6 +12,7 @@ package org.eclipse.cdt.core;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExecutableExtension;
public interface ICExtensionReference { public interface ICExtensionReference {
@ -40,6 +41,12 @@ public interface ICExtensionReference {
*/ */
public String getExtensionData(String key); public String getExtensionData(String key);
/**
* Returns the project descriptor which this extension reference belongs to.
* @return the ICDescriptor
*/
public ICDescriptor getCDescriptor();
/** /**
* Creates and returns a new instance of the cextension executable * Creates and returns a new instance of the cextension executable
* identified by the &lt;run&gt; attribute of the cextension. * identified by the &lt;run&gt; attribute of the cextension.

View file

@ -1,16 +1,15 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2000, 2004 QNX Software Systems and others. * Copyright (c) 2000, 2004 QNX Software Systems and others. All rights
* All rights reserved. This program and the accompanying materials * reserved. This program and the accompanying materials are made available
* are made available under the terms of the Common Public License v1.0 * under the terms of the Common Public License v1.0 which accompanies this
* which accompanies this distribution, and is available at * distribution, and is available at http://www.eclipse.org/legal/cpl-v10.html
* http://www.eclipse.org/legal/cpl-v10.html
* *
* Contributors: * Contributors: QNX Software Systems - Initial API and implementation
* QNX Software Systems - Initial API and implementation ******************************************************************************/
*******************************************************************************/
package org.eclipse.cdt.internal.core; package org.eclipse.cdt.internal.core;
import org.eclipse.cdt.core.CDescriptorEvent; import org.eclipse.cdt.core.CDescriptorEvent;
import org.eclipse.cdt.core.ICDescriptor;
import org.eclipse.cdt.core.ICExtension; import org.eclipse.cdt.core.ICExtension;
import org.eclipse.cdt.core.ICExtensionReference; import org.eclipse.cdt.core.ICExtensionReference;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
@ -36,6 +35,10 @@ public class CExtensionReference implements ICExtensionReference {
return fId; return fId;
} }
public ICDescriptor getCDescriptor() {
return fDescriptor;
}
private CExtensionInfo getInfo() { private CExtensionInfo getInfo() {
return fDescriptor.getInfo(this); return fDescriptor.getInfo(this);
} }
@ -45,7 +48,7 @@ public class CExtensionReference implements ICExtensionReference {
return true; return true;
} }
if (obj instanceof CExtensionReference) { if (obj instanceof CExtensionReference) {
CExtensionReference ext = (CExtensionReference) obj; CExtensionReference ext = (CExtensionReference)obj;
if (ext.fExtPoint.equals(fExtPoint) && ext.fId.equals(fId)) { if (ext.fExtPoint.equals(fExtPoint) && ext.fId.equals(fId)) {
return true; return true;
} }