/******************************************************************************* * Copyright (c) 2000, 2009 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 * Anton Leherbauer (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.model; import java.io.IOException; import java.util.Map; import org.eclipse.cdt.core.IAddress; 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.ICProject; 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.cdt.internal.core.util.MementoTokenizer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Path; /** */ public class BinaryElement extends CElement implements IBinaryElement, ISourceManipulation, ISourceReference { IAddress addr; int fStartLine; int fEndLine; ITranslationUnit fSourceTU; public BinaryElement(ICElement parent, String name, int type, IAddress a) { super(parent, name, type); 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 { ITranslationUnit tu = getTranslationUnit(); if (tu != null) { try { IResource res = tu.getResource(); if (res != null && res instanceof IFile) { StringBuffer buffer = Util.getContent((IFile)res); return buffer.substring(getStartPos(), getStartPos() + getLength()); } } catch (IOException e) { throw new CModelException(e, ICModelStatusConstants.IO_EXCEPTION); } } return ""; //$NON-NLS-1$ } /* (non-Javadoc) * @see org.eclipse.cdt.core.model.ISourceReference#getSourceRange() */ public ISourceRange getSourceRange() throws CModelException { return new SourceRange(getStartPos(), getLength(), getIdStartPos(), getIdLength(), getStartLine(), getEndLine()); } /* (non-Javadoc) * @see org.eclipse.cdt.core.model.ISourceReference#getTranslationUnit() */ public ITranslationUnit getTranslationUnit() { if (fSourceTU == null) { ITranslationUnit tu = null; CModelManager mgr = CModelManager.getDefault(); ICElement parent = getParent(); if (parent != null) { IPath path = parent.getPath(); if (path != null && path.isAbsolute()) { IResource res = mgr.getCModel().getWorkspace().getRoot().getFileForLocation(path); if (res != null && res.exists() && res.getType() == IResource.FILE) { ICElement e = CModelManager.getDefault().create(res, null); if (e instanceof ITranslationUnit) { tu = (ITranslationUnit)e; } } // do not give up yet in C++ the methods may be inline in the headers ICProject cproject = getCProject(); tu = mgr.createTranslationUnitFrom(cproject, path); } else { // TODO-model: handle non-absolute paths when finding source files // ??? assert() path = new Path(""); //$NON-NLS-1$ } // Fall back to the project sourcemapper. if (tu == null) { ICProject cproject = getCProject(); SourceMapper mapper = mgr.getSourceMapper(cproject); if (mapper != null) { String lastSegment = path.lastSegment(); if (lastSegment != null) { tu = mapper.findTranslationUnit(lastSegment); } } } } fSourceTU = tu; } return fSourceTU; } /* (non-Javadoc) * @see org.eclipse.cdt.internal.core.model.CElement#createElementInfo() */ @Override protected CElementInfo createElementInfo() { return new CElementInfo(this); } /* (non-Javadoc) * @see org.eclipse.cdt.core.model.ICElement#getResource() */ @Override public IResource getResource() { return null; } /* (non-Javadoc) * @see org.eclipse.cdt.core.model.IBinaryElement#getAddress() */ public IAddress getAddress() throws CModelException { return addr; } public void setLines(int startline, int endLine) { fStartLine = startline; fEndLine = endLine; } public int getStartLine() { return fStartLine; } public int getEndLine() { return fEndLine; } private int getLength() { // TODO Auto-generated method stub return 0; } public int getStartPos() { // TODO Auto-generated method stub return 0; } private int getIdLength() { // TODO Auto-generated method stub return 0; } public int getIdStartPos() { // 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; } /* (non-Javadoc) * @see org.eclipse.cdt.internal.core.model.CElement#generateInfos(java.lang.Object, java.util.Map, org.eclipse.core.runtime.IProgressMonitor) */ @Override protected void generateInfos(CElementInfo info, Map<ICElement, CElementInfo> newElements, IProgressMonitor monitor) throws CModelException { } @Override public ICElement getHandleFromMemento(String token, MementoTokenizer memento) { return null; } @Override public String getHandleMemento() { return null; } @Override protected char getHandleMementoDelimiter() { Assert.isTrue(false, "Should not be called"); //$NON-NLS-1$ return 0; } public boolean isActive() { return true; } public int getIndex() { return 0; } }