From aaad8cbc6ba13f43a51588a7aea18e31b56207d2 Mon Sep 17 00:00:00 2001 From: Alain Magloire Date: Mon, 31 Mar 2003 03:46:57 +0000 Subject: [PATCH] New class hierarchy for the binary and Archive: IBinary IBinaryModule IBinaryFunction IBinaryVariable IBinaryElement --- .../cdt/internal/core/model/Archive.java | 9 +- .../cdt/internal/core/model/Binary.java | 203 ++++++++---------- .../internal/core/model/BinaryElement.java | 140 ++++++++++++ .../internal/core/model/BinaryFunction.java | 101 +++++++++ .../cdt/internal/core/model/BinaryInfo.java | 110 ---------- .../cdt/internal/core/model/BinaryModule.java | 79 +++++++ .../internal/core/model/BinaryVariable.java | 74 +++++++ .../cdt/internal/core/model/CContainer.java | 2 +- .../internal/core/model/CContainerInfo.java | 2 +- .../cdt/internal/core/model/CElement.java | 21 +- .../internal/core/model/CModelManager.java | 78 ++----- .../cdt/internal/core/model/Openable.java | 22 +- .../cdt/internal/core/model/Parent.java | 36 ---- 13 files changed, 533 insertions(+), 344 deletions(-) create mode 100644 core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryElement.java create mode 100644 core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryFunction.java create mode 100644 core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryModule.java create mode 100644 core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryVariable.java diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Archive.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Archive.java index 5727ce434ce..ef967f15034 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Archive.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Archive.java @@ -62,14 +62,7 @@ public class Archive extends Openable implements IArchive { IBinaryObject[] objects = ar.getObjects(); for (int i = 0; i < objects.length; i++) { final IBinaryObject obj = objects[i]; - Binary binary = new Binary(this, res.getLocation().append(obj.getName())) { - protected IBinaryObject getBinaryObject(IResource res) { - return obj; - } - }; - - // Force the loading of the children inf the Info by callin getElementInfo. - binary.getElementInfo(); + Binary binary = new Binary(this, res.getLocation().append(obj.getName()), obj); info.addChild(binary); } } else { diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Binary.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Binary.java index 4fc5cde0761..0f840834d7d 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Binary.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Binary.java @@ -5,20 +5,18 @@ package org.eclipse.cdt.internal.core.model; * All Rights Reserved. */ -import java.io.IOException; -import java.util.ArrayList; import java.util.HashMap; import java.util.Map; -import org.eclipse.cdt.core.IBinaryParser; +import org.eclipse.cdt.core.IBinaryParser.IBinaryExecutable; import org.eclipse.cdt.core.IBinaryParser.IBinaryFile; import org.eclipse.cdt.core.IBinaryParser.IBinaryObject; +import org.eclipse.cdt.core.IBinaryParser.IBinaryShared; import org.eclipse.cdt.core.IBinaryParser.ISymbol; import org.eclipse.cdt.core.model.CModelException; import org.eclipse.cdt.core.model.IBinary; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; @@ -26,67 +24,101 @@ import org.eclipse.core.runtime.Path; public class Binary extends Openable implements IBinary { - public Binary(ICElement parent, IFile file) { - this(parent, file.getLocation()); + IBinaryFile binaryFile; + + public Binary(ICElement parent, IFile file, IBinaryFile bin) { + super(parent, file, ICElement.C_BINARY); + binaryFile = bin; } - public Binary(ICElement parent, IPath path) { + public Binary(ICElement parent, IPath path, IBinaryFile bin) { super (parent, path, ICElement.C_BINARY); + binaryFile = bin; } - public Binary(ICElement parent, IFile file, String name) { - super(parent, file, name, ICElement.C_BINARY); - } - public boolean hasDebug () { - return ((BinaryInfo)getElementInfo()).hasDebug(); + public boolean isSharedLib() { + if (binaryFile != null) { + return binaryFile.getType() == IBinaryObject.SHARED; + } + return false; } public boolean isExecutable() { - return ((BinaryInfo)getElementInfo()).isExecutable(); + if (binaryFile != null) { + return binaryFile.getType() == IBinaryObject.EXECUTABLE; + } + return false; } public boolean isObject() { - return ((BinaryInfo)getElementInfo()).isObject(); - } - - public boolean isSharedLib() { - return ((BinaryInfo)getElementInfo()).isSharedLib(); + if (binaryFile != null) { + return binaryFile.getType() == IBinaryObject.OBJECT; + } + return false; } public boolean isCore() { - return ((BinaryInfo)getElementInfo()).isCore(); + if (binaryFile != null) { + return binaryFile.getType() == IBinaryObject.CORE; + } + return false; } - public String [] getNeededSharedLibs() { - return ((BinaryInfo)getElementInfo()).getNeededSharedLibs(); + public boolean hasDebug() { + if (isObject() || isExecutable() || isSharedLib()) { + return ((IBinaryObject)binaryFile).hasDebug(); + } + return false; } public String getCPU() { - return ((BinaryInfo)getElementInfo()).getCPU(); + if (isObject() || isExecutable() || isSharedLib() || isCore()) { + return ((IBinaryObject)binaryFile).getCPU(); + } + return ""; + } + + public String[] getNeededSharedLibs() { + if (isExecutable()) { + return ((IBinaryExecutable)binaryFile).getNeededSharedLibs(); + } + return new String[0]; } public long getText() { - return ((BinaryInfo)getElementInfo()).getText(); + if (isObject() || isExecutable() || isSharedLib()) { + return ((IBinaryObject)binaryFile).getText(); + } + return 0; } public long getData() { - return ((BinaryInfo)getElementInfo()).getData(); + if (isObject() || isExecutable() || isSharedLib()) { + return ((IBinaryObject)binaryFile).getData(); + } + return 0; } public long getBSS() { - return ((BinaryInfo)getElementInfo()).getBSS(); + if (isObject() || isExecutable() || isSharedLib()) { + return ((IBinaryObject)binaryFile).getBSS(); + } + return 0; } public String getSoname() { - return ((BinaryInfo)getElementInfo()).getSoname(); + if (isSharedLib()) { + return ((IBinaryShared)binaryFile).getSoName(); + } + return ""; } - /** - * @see org.eclipse.cdt.core.model.IBinary#isLittleEndian() - */ public boolean isLittleEndian() { - return ((BinaryInfo)getElementInfo()).isLittleEndian(); + if (isObject() || isExecutable() || isSharedLib() || isCore()) { + return ((IBinaryObject)binaryFile).isLittleEndian(); + } + return false; } public CElementInfo createElementInfo() { @@ -104,10 +136,9 @@ public class Binary extends Openable implements IBinary { boolean computeChildren(OpenableInfo info, IResource res) { - IBinaryObject bin = getBinaryObject(res); - if (bin != null) { + if (isObject() || isExecutable() || isSharedLib()) { Map hash = new HashMap(); - ISymbol[] symbols = bin.getSymbols(); + ISymbol[] symbols = ((IBinaryObject)binaryFile).getSymbols(); for (int i = 0; i < symbols.length; i++) { switch (symbols[i].getType()) { case ISymbol.FUNCTION : @@ -119,74 +150,37 @@ public class Binary extends Openable implements IBinary { break; } } - if (info instanceof BinaryInfo) { - ((BinaryInfo)info).loadInfo(bin); - } } else { return false; } return true; } - protected IBinaryObject getBinaryObject(IResource res) { - IBinaryObject binary = null; - IBinaryParser parser = null; - IProject project = null; - if (res != null) { - project = res.getProject(); - } - if (project != null) { - parser = CModelManager.getDefault().getBinaryParser(project); - } - if (parser != null) { - try { - IPath path = res.getLocation(); - IBinaryFile bfile = parser.getBinary(path); - if (bfile instanceof IBinaryObject) { - binary = (IBinaryObject) bfile; - } - } catch (IOException e) { - } - } - return binary; - } - private void addFunction(OpenableInfo info, ISymbol symbol, Map hash) { - ICElement parent = this; String filename = filename = symbol.getFilename(); - Function function = null; + BinaryFunction function = null; // Addr2line returns the funny "??" when it can find the file. if (filename != null && !filename.equals("??")) { - TranslationUnit tu = null; + BinaryModule module = null; IPath path = new Path(filename); if (hash.containsKey(path)) { - tu = (TranslationUnit) hash.get(path); + module = (BinaryModule)hash.get(path); } else { - // A special ITranslationUnit we do not want the file to be parse. - tu = new TranslationUnit(parent, path) { - ArrayList array = new ArrayList(5); - public void addChild(ICElement e) { - array.add(e); - array.trimToSize(); - } - - public ICElement [] getChildren() { - return (ICElement[])array.toArray(new ICElement[0]); - } - - protected boolean generateInfos(OpenableInfo info, IProgressMonitor pm, - Map newElements, IResource underlyingResource) throws CModelException { - return true; - } - }; - hash.put(path, tu); - info.addChild(tu); + // A special container we do not want the file to be parse. + module = new BinaryModule(this, path); + hash.put(path, module); + info.addChild(module); } - function = new Function(tu, symbol.getName()); - tu.addChild(function); + function = new BinaryFunction(module, symbol.getName()); + function.setLines(symbol.getStartLine(), symbol.getEndLine()); + function.setAddress(symbol.getAdress()); + module.addChild(function); } else { - function = new Function(parent, symbol.getName()); + //function = new Function(parent, symbol.getName()); + function = new BinaryFunction(this, symbol.getName()); + function.setLines(symbol.getStartLine(), symbol.getEndLine()); + function.setAddress(symbol.getAdress()); info.addChild(function); } // if (function != null) { @@ -198,40 +192,29 @@ public class Binary extends Openable implements IBinary { private void addVariable(OpenableInfo info, ISymbol symbol, Map hash) { String filename = filename = symbol.getFilename(); - ICElement parent = this; - Variable variable = null; + BinaryVariable variable = null; // Addr2line returns the funny "??" when it can not find the file. if (filename != null && !filename.equals("??")) { - TranslationUnit tu = null; + BinaryModule module = null; IPath path = new Path(filename); if (hash.containsKey(path)) { - tu = (TranslationUnit) hash.get(path); + module = (BinaryModule)hash.get(path); } else { - tu = new TranslationUnit(parent, path) { - ArrayList array = new ArrayList(5); - public void addChild(ICElement e) { - array.add(e); - array.trimToSize(); - } - - public ICElement [] getChildren() { - return (ICElement[])array.toArray(new ICElement[0]); - } - - protected boolean generateInfos(OpenableInfo info, IProgressMonitor pm, - Map newElements, IResource underlyingResource) throws CModelException { - return true; - } - }; - hash.put(path, tu); - info.addChild(tu); + module = new BinaryModule(this, path); + hash.put(path, module); + info.addChild(module); } - variable = new Variable(tu, symbol.getName()); - tu.addChild(variable); + variable = new BinaryVariable(module, symbol.getName()); + variable.setLines(symbol.getStartLine(), symbol.getEndLine()); + variable.setAddress(symbol.getAdress()); + module.addChild(variable); } else { - variable = new Variable(parent, symbol.getName()); + variable = new BinaryVariable(this, symbol.getName()); + variable.setLines(symbol.getStartLine(), symbol.getEndLine()); + variable.setAddress(symbol.getAdress()); info.addChild(variable); } + //if (variable != null) { // if (!external) { // variable.getVariableInfo().setAccessControl(IConstants.AccStatic); diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryElement.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryElement.java new file mode 100644 index 00000000000..e5b5320ee6a --- /dev/null +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryElement.java @@ -0,0 +1,140 @@ +/* + * Created on Mar 30, 2003 + * + * To change the template for this generated file go to + * Window>Preferences>Java>Code Generation>Code and Comments + */ +package org.eclipse.cdt.internal.core.model; + +import org.eclipse.cdt.core.model.CModelException; +import org.eclipse.cdt.core.model.IBinary; +import org.eclipse.cdt.core.model.IBinaryElement; +import org.eclipse.cdt.core.model.ICElement; +import org.eclipse.cdt.core.model.ICModelStatusConstants; +import org.eclipse.cdt.core.model.ISourceManipulation; +import org.eclipse.cdt.core.model.ISourceRange; +import org.eclipse.cdt.core.model.ISourceReference; +import org.eclipse.cdt.core.model.ITranslationUnit; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.IProgressMonitor; + +/** + * @author alain + * + * To change the template for this generated type comment go to + * Window>Preferences>Java>Code Generation>Code and Comments + */ +public class BinaryElement extends CElement implements IBinaryElement, ISourceManipulation, ISourceReference { + + long addr; + + public BinaryElement(ICElement parent, String name, int type) { + super(parent, name, type); + } + + public void setAddress(long a) { + addr = a; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.model.ISourceManipulation#copy(org.eclipse.cdt.core.model.ICElement, org.eclipse.cdt.core.model.ICElement, java.lang.String, boolean, org.eclipse.core.runtime.IProgressMonitor) + */ + public void copy( + ICElement container, + ICElement sibling, + String rename, + boolean replace, + IProgressMonitor monitor) + throws CModelException { + throw new CModelException(new CModelStatus(ICModelStatusConstants.READ_ONLY, this)); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.model.ISourceManipulation#delete(boolean, org.eclipse.core.runtime.IProgressMonitor) + */ + public void delete(boolean force, IProgressMonitor monitor) + throws CModelException { + throw new CModelException(new CModelStatus(ICModelStatusConstants.READ_ONLY, this)); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.model.ISourceManipulation#move(org.eclipse.cdt.core.model.ICElement, org.eclipse.cdt.core.model.ICElement, java.lang.String, boolean, org.eclipse.core.runtime.IProgressMonitor) + */ + public void move( + ICElement container, + ICElement sibling, + String rename, + boolean replace, + IProgressMonitor monitor) + throws CModelException { + throw new CModelException(new CModelStatus(ICModelStatusConstants.READ_ONLY, this)); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.model.ISourceManipulation#rename(java.lang.String, boolean, org.eclipse.core.runtime.IProgressMonitor) + */ + public void rename(String name, boolean replace, IProgressMonitor monitor) + throws CModelException { + throw new CModelException(new CModelStatus(ICModelStatusConstants.READ_ONLY, this)); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.model.ISourceReference#getSource() + */ + public String getSource() throws CModelException { + // TODO Auto-generated method stub + return null; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.model.ISourceReference#getSourceRange() + */ + public ISourceRange getSourceRange() throws CModelException { + // TODO Auto-generated method stub + return null; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.model.ISourceReference#getTranslationUnit() + */ + public ITranslationUnit getTranslationUnit() { + // TODO Auto-generated method stub + return null; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.model.CElement#createElementInfo() + */ + protected CElementInfo createElementInfo() { + return new CElementInfo(this); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.model.ICElement#getResource() + */ + public IResource getResource() { + return null; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.model.IBinaryElement#getAddress() + */ + public long getAddress() throws CModelException { + // TODO Auto-generated method stub + return 0; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.model.IBinaryElement#getBinary() + */ + public IBinary getBinary() { + ICElement current = this; + do { + if (current instanceof IBinary) { + return (IBinary) current; + } + } while ((current = current.getParent()) != null); + return null; + } + +} diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryFunction.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryFunction.java new file mode 100644 index 00000000000..76eafa8ab90 --- /dev/null +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryFunction.java @@ -0,0 +1,101 @@ +/* + * (c) Copyright QNX Software Systems Ltd. 2002. + * All Rights Reserved. + */ + +package org.eclipse.cdt.internal.core.model; + +import org.eclipse.cdt.core.model.ICElement; +import org.eclipse.cdt.core.model.IFunction; + +/** + * @author alain + * + * To change the template for this generated type comment go to + * Window>Preferences>Java>Code Generation>Code and Comments + */ +public class BinaryFunction extends BinaryElement implements IFunction { + + public BinaryFunction(ICElement parent, String name) { + super(parent, name, ICElement.C_FUNCTION); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.model.IFunctionDeclaration#getExceptions() + */ + public String[] getExceptions() { + return new String[0]; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.model.IFunctionDeclaration#getNumberOfParameters() + */ + public int getNumberOfParameters() { + // TODO Auto-generated method stub + return 0; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.model.IFunctionDeclaration#getParameterInitializer(int) + */ + public String getParameterInitializer(int pos) { + // TODO Auto-generated method stub + return new String(); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.model.IFunctionDeclaration#getParameterTypes() + */ + public String[] getParameterTypes() { + // TODO Auto-generated method stub + return new String[0]; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.model.IFunctionDeclaration#getReturnType() + */ + public String getReturnType() { + // TODO Auto-generated method stub + return new String(); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.model.IFunctionDeclaration#getSignature() + */ + public String getSignature() { + return getElementName(); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.model.IDeclaration#isStatic() + */ + public boolean isStatic() { + // TODO Auto-generated method stub + return false; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.model.IDeclaration#isConst() + */ + public boolean isConst() { + // TODO Auto-generated method stub + return false; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.model.IDeclaration#isVolatile() + */ + public boolean isVolatile() { + // TODO Auto-generated method stub + return false; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.model.IDeclaration#getAccessControl() + */ + public int getAccessControl() { + // TODO Auto-generated method stub + return 0; + } + +} diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryInfo.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryInfo.java index 559d6784961..e323eee3838 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryInfo.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryInfo.java @@ -5,121 +5,11 @@ package org.eclipse.cdt.internal.core.model; * All Rights Reserved. */ -import java.io.IOException; - -import org.eclipse.cdt.core.IBinaryParser; -import org.eclipse.cdt.core.IBinaryParser.IBinaryExecutable; -import org.eclipse.cdt.core.IBinaryParser.IBinaryFile; -import org.eclipse.cdt.core.IBinaryParser.IBinaryObject; -import org.eclipse.cdt.core.IBinaryParser.IBinaryShared; -import org.eclipse.cdt.core.model.CModelException; -import org.eclipse.core.resources.IProject; -import org.eclipse.core.runtime.IPath; class BinaryInfo extends OpenableInfo { - int type; - boolean debug; - String cpu = ""; - String shared[] = new String[0]; - long text; - long data; - long bss; - String soname = ""; - boolean littleE; - public BinaryInfo(CElement element) { super(element); } - public String getCPU() { - return cpu; - } - - public boolean isSharedLib() { - return type == IBinaryObject.SHARED; - } - - public boolean isExecutable() { - return type == IBinaryObject.EXECUTABLE; - } - - public boolean isObject() { - return type == IBinaryObject.OBJECT; - } - - public boolean isCore() { - return type == IBinaryObject.CORE; - } - - public boolean hasDebug() { - return debug; - } - - public String[] getNeededSharedLibs() { - return shared; - } - - public long getText() { - return text; - } - - public long getData() { - return data; - } - - public long getBSS() { - return bss; - } - - public String getSoname() { - return soname; - } - - public boolean isLittleEndian() { - return littleE; - } - - protected void loadInfo() { - loadInfo(getBinaryObject()); - } - - protected void loadInfo(IBinaryObject bin) { - if (bin != null) { - type = bin.getType(); - cpu = bin.getCPU(); - debug = bin.hasDebug(); - if (isExecutable()) { - IBinaryExecutable exec = (IBinaryExecutable) bin; - shared = exec.getNeededSharedLibs(); - } - text = bin.getText(); - data = bin.getData(); - bss = bin.getBSS(); - if (isSharedLib()) { - IBinaryShared shared = (IBinaryShared) bin; - soname = shared.getSoName(); - } - littleE = bin.isLittleEndian(); - } - } - - private IBinaryObject getBinaryObject() { - IBinaryObject binary = null; - IProject project = getElement().getCProject().getProject(); - IBinaryParser parser = CModelManager.getDefault().getBinaryParser(project); - if (parser != null) { - try { - IPath path = getElement().getUnderlyingResource().getLocation(); - IBinaryFile bfile = parser.getBinary(path); - if (bfile instanceof IBinaryObject) { - binary = (IBinaryObject) bfile; - } - } catch (CModelException e) { - } catch (IOException e) { - } - } - return binary; - } - } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryModule.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryModule.java new file mode 100644 index 00000000000..8b0a60c36cb --- /dev/null +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryModule.java @@ -0,0 +1,79 @@ +/* + * (c) Copyright QNX Software Systems Ltd. 2002. + * All Rights Reserved. + */ + +package org.eclipse.cdt.internal.core.model; + +import org.eclipse.cdt.core.model.CModelException; +import org.eclipse.cdt.core.model.IBinary; +import org.eclipse.cdt.core.model.IBinaryElement; +import org.eclipse.cdt.core.model.IBinaryModule; +import org.eclipse.cdt.core.model.ICElement; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.IPath; + +/** + */ +public class BinaryModule extends Parent implements IBinaryModule { + + IPath path; + + public BinaryModule(Binary parent, IPath p) { + super(parent, p.lastSegment(), ICElement.C_VCONTAINER); + path = p; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.model.IBinaryModule#getBinaryElements() + */ + public IBinaryElement[] getBinaryElements() { + ICElement[] e = getChildren(); + IBinaryElement[] b = new IBinaryElement[e.length]; + System.arraycopy(e, 0, b, 0, e.length); + return b; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.model.IBinaryElement#getAddress() + */ + public long getAddress() throws CModelException { + return 0; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.model.IBinaryElement#getBinary() + */ + public IBinary getBinary() { + return (IBinary)getParent(); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.model.ICElement#getResource() + */ + public IResource getResource() { + return null; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.model.ICElement#isReadOnly() + */ + public boolean isReadOnly() { + return true; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.model.CElement#createElementInfo() + */ + protected CElementInfo createElementInfo() { + return new CElementInfo(this); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.model.ICElement#getPath() + */ + public IPath getPath() { + return path; + } + +} diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryVariable.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryVariable.java new file mode 100644 index 00000000000..3be97851977 --- /dev/null +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryVariable.java @@ -0,0 +1,74 @@ +/* + * (c) Copyright QNX Software Systems Ltd. 2002. + * All Rights Reserved. + */ +package org.eclipse.cdt.internal.core.model; + +import org.eclipse.cdt.core.model.ICElement; +import org.eclipse.cdt.core.model.IVariable; + +/** + * + */ +public class BinaryVariable extends BinaryElement implements IVariable { + + public BinaryVariable(ICElement parent, String name) { + super(parent, name, ICElement.C_VARIABLE); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.model.IVariable#getInitializer() + */ + public String getInitializer() { + // TODO Auto-generated method stub + return ""; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.model.IVariableDeclaration#getTypeName() + */ + public String getTypeName() { + // TODO Auto-generated method stub + return ""; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.model.IVariableDeclaration#setTypeName(java.lang.String) + */ + public void setTypeName(String type) { + // TODO Auto-generated method stub + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.model.IDeclaration#isStatic() + */ + public boolean isStatic() { + // TODO Auto-generated method stub + return false; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.model.IDeclaration#isConst() + */ + public boolean isConst() { + // TODO Auto-generated method stub + return false; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.model.IDeclaration#isVolatile() + */ + public boolean isVolatile() { + // TODO Auto-generated method stub + return false; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.model.IDeclaration#getAccessControl() + */ + public int getAccessControl() { + // TODO Auto-generated method stub + return 0; + } + +} diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CContainer.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CContainer.java index 58d28712996..19e9cef666a 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CContainer.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CContainer.java @@ -138,7 +138,7 @@ public class CContainer extends Openable implements ICContainer { } catch (CoreException e) { //System.out.println (e); //CPlugin.log (e); - e.printStackTrace(); + //e.printStackTrace(); } ICElement[] children = new ICElement[vChildren.size()]; vChildren.toArray(children); diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CContainerInfo.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CContainerInfo.java index da3626c85a1..7973ea3805a 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CContainerInfo.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CContainerInfo.java @@ -69,7 +69,7 @@ public class CContainerInfo extends OpenableInfo { } catch (CoreException e) { //System.out.println (e); //CPlugin.log (e); - e.printStackTrace(); + //e.printStackTrace(); } setNonCResources(notChildren.toArray()); return nonCResources; diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CElement.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CElement.java index 842b989cf72..de85303c219 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CElement.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CElement.java @@ -14,6 +14,7 @@ import org.eclipse.cdt.core.model.IParent; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.PlatformObject; public abstract class CElement extends PlatformObject implements ICElement { @@ -75,7 +76,7 @@ public abstract class CElement extends PlatformObject implements ICElement { } catch (CModelException e) { e.printStackTrace(); } - return null; + return new Path(getElementName()); } public boolean exists() { @@ -155,8 +156,16 @@ public abstract class CElement extends PlatformObject implements ICElement { fEndLine = endLine; } - - public abstract IResource getUnderlyingResource() throws CModelException; + public IResource getUnderlyingResource() throws CModelException { + IResource res = getResource(); + if (res == null) { + ICElement p = getParent(); + if (p != null) { + res = p.getUnderlyingResource(); + } + } + return res; + } public abstract IResource getResource() ; @@ -292,8 +301,10 @@ public abstract class CElement extends PlatformObject implements ICElement { *

Subclasses that are not IOpenable's must override this method. */ public IOpenable getOpenableParent() { - - return (IOpenable)fParent; + if (fParent instanceof IOpenable) { + return (IOpenable)fParent; + } + return null; } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelManager.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelManager.java index 6743a77efd2..30cf19f4348 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelManager.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelManager.java @@ -26,6 +26,7 @@ import org.eclipse.cdt.core.model.ICElementDelta; import org.eclipse.cdt.core.model.ICModel; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.IElementChangedListener; +import org.eclipse.cdt.core.model.IParent; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; @@ -210,26 +211,11 @@ public class CModelManager implements IResourceChangeListener { if (bin.getType() == IBinaryFile.ARCHIVE) { cfile = new Archive(parent, file); } else { - cfile = new Binary(parent, file); + cfile = new Binary(parent, file, bin); } } else if (isTranslationUnit(file)) { cfile = new TranslationUnit(parent, file); } - //else { - // cfile = new CFile(parent, file); - //} - } else { - // Probably it was deleted, find it - if (parent instanceof CElement) { - ICElement[] children = ((CElement)parent).getElementInfo().getChildren(); - for (int i = 0; i < children.length; i++) { - IResource res = children[i].getResource(); - if (res != null && res.equals(file)) { - cfile = children[i]; - break; - } - } - } } // Added also to the Containers if (cfile != null && (cfile instanceof IBinary || cfile instanceof IArchive)) { @@ -305,26 +291,6 @@ public class CModelManager implements IResourceChangeListener { } } - - public void releaseCElement(IResource resource) { - ICElement celement = getCElement(resource); - if (celement == null) { - if (resource.exists()) { - celement = create(resource); - } else { - // Make sure they are not in the Containers. - CProject cproj = (CProject)create(resource.getProject()); - if (cproj != null) { - Parent container = (Parent)cproj.getArchiveContainer(); - removeChildrenContainer(container, resource); - container = (Parent)cproj.getBinaryContainer(); - removeChildrenContainer(container, resource); - } - } - } - releaseCElement(celement); - } - public void releaseCElement(ICElement celement) { // Guard. @@ -349,30 +315,25 @@ public class CModelManager implements IResourceChangeListener { } } + if (celement instanceof IParent) { + CElementInfo info = ((CElement)celement).getElementInfo(); + if (info != null) { + ICElement[] children = info.getChildren(); + for (int i = 0; i < children.length; i++) { + releaseCElement(children[i]); + } + } + } + // Remove the child from the parent list. Parent parent = (Parent)celement.getParent(); if (parent != null) { parent.removeChild(celement); } - if (celement instanceof CElement) { - CElementInfo info = ((CElement)celement).getElementInfo(); - ICElement[] children = info.getChildren(); - for (int i = 0; i < children.length; i++) { - releaseCElement(children[i]); - } - } removeInfo(celement); } - public ICElement getCElement(IResource res) { - return create(res); - } - - public ICElement getCElement(IPath path) { - return create(path); - } - public IBinaryParser getBinaryParser(IProject project) { try { return CCorePlugin.getDefault().getBinaryParser(project); @@ -396,12 +357,15 @@ public class CModelManager implements IResourceChangeListener { */ public void resetBinaryParser(IProject project) { if (project != null) { - releaseCElement(project); - // Fired and ICElementDelta.PARSER_CHANGED - CElementDelta delta = new CElementDelta(getCModel()); - delta.binaryParserChanged(create(project)); - registerCModelDelta(delta); - fire(); + ICElement celement = create(project); + if (celement != null) { + releaseCElement(celement); + // Fired and ICElementDelta.PARSER_CHANGED + CElementDelta delta = new CElementDelta(getCModel()); + delta.binaryParserChanged(celement); + registerCModelDelta(delta); + fire(); + } } } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Openable.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Openable.java index 6a81b8a30c2..5fb09178a5b 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Openable.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Openable.java @@ -23,7 +23,9 @@ import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; public abstract class Openable extends Parent implements IOpenable, IBufferChangedListener { - + + protected IResource resource; + public Openable (ICElement parent, IPath path, int type) { // Check if the file is under the workspace. this (parent, ResourcesPlugin.getWorkspace().getRoot().getFileForLocation (path), @@ -34,26 +36,14 @@ public abstract class Openable extends Parent implements IOpenable, IBufferChang this (parent, resource, resource.getName(), type); } - public Openable (ICElement parent, IResource resource, String name, int type) { - super (parent, resource, name, type); - } - - public IResource getUnderlyingResource() throws CModelException { - IResource res = getResource(); - if (res == null) { - ICElement p = getParent(); - if (p != null) { - res = p.getUnderlyingResource(); - } - } - return res; + public Openable (ICElement parent, IResource res, String name, int type) { + super (parent, name, type); + resource = res; } public IResource getResource() { return resource; } - - protected abstract CElementInfo createElementInfo (); /** * The buffer associated with this element has changed. Registers diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Parent.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Parent.java index c42b202e73b..40581c621f9 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Parent.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Parent.java @@ -7,30 +7,13 @@ package org.eclipse.cdt.internal.core.model; import java.util.ArrayList; -import org.eclipse.cdt.core.model.CModelException; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.IParent; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.IPath; public abstract class Parent extends CElement implements IParent { - - protected IResource resource; - - public Parent (ICElement parent, IPath path, int type) { - // Check if the file is under the workspace. - this (parent, ResourcesPlugin.getWorkspace().getRoot().getFileForLocation (path), - path.lastSegment(), type); - } public Parent (ICElement parent, String name, int type) { - this (parent, null, name, type); - } - - public Parent (ICElement parent, IResource resource, String name, int type) { super (parent, name, type); - this.resource = resource; } // members @@ -86,24 +69,6 @@ public abstract class Parent extends CElement implements IParent { return getElementInfo().hasChildren(); } - public void setUnderlyingResource(IResource res) { - resource = res; - } - - public IResource getUnderlyingResource() throws CModelException { - if (resource == null) { - ICElement p = getParent(); - if (p != null) { - return p.getUnderlyingResource(); - } - } - return resource; - } - - public IResource getResource() { - return resource; - } - protected void setChanged () { getElementInfo().setChanged(); } @@ -112,5 +77,4 @@ public abstract class Parent extends CElement implements IParent { return getElementInfo().hasChanged(); } - protected abstract CElementInfo createElementInfo (); }