/*******************************************************************************
* Copyright (c) 2006, 2010 Wind River Systems, Inc. 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:
* Markus Schorn - initial API and implementation
* Anton Leherbauer (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.model.ext;
import java.net.URI;
import java.util.Collections;
import java.util.List;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.IPositionConverter;
import org.eclipse.cdt.core.dom.ast.ASTTypeUtil;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IFunction;
import org.eclipse.cdt.core.dom.ast.IParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMember;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICElementVisitor;
import org.eclipse.cdt.core.model.ICModel;
import org.eclipse.cdt.core.model.ICProject;
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.core.parser.ast.ASTAccessVisibility;
import org.eclipse.cdt.internal.core.model.CElement;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.Region;
abstract class CElementHandle implements ICElementHandle, ISourceReference {
protected static final String[] EMPTY_STRING_ARRAY = new String[0];
private static final ICElement[] NO_CHILDREN = new ICElement[0];
private ICElement fParent;
private String fName;
private int fType;
private IRegion fRegion;
private long fTimestamp;
private int fIndex;
public CElementHandle(ICElement parent, int type, String name) {
fParent= parent;
fType= type;
// anonymous types are assigned a name in the index, we
// undo this here
if (name.length() > 0 && name.charAt(0)=='{') {
fName= ""; //$NON-NLS-1$
fIndex= name.hashCode();
} else {
fName= name;
}
fRegion= new Region(0,0);
}
@Override
public boolean equals(Object obj) {
if (obj instanceof ICElement) {
return CElement.equals(this, (ICElement) obj);
}
return false;
}
@Override
public int hashCode() {
return CElement.hashCode(this);
}
@SuppressWarnings("rawtypes")
public Object getAdapter(Class adapter) {
return null;
}
public void setRangeOfID(IRegion region, long timestamp) {
fRegion= region;
fTimestamp= timestamp;
}
public ISourceRange getSourceRange() throws CModelException {
IRegion region= fRegion;
ITranslationUnit tu= getTranslationUnit();
if (tu != null) {
IPositionConverter converter= CCorePlugin.getPositionTrackerManager().findPositionConverter(tu, fTimestamp);
if (converter != null) {
region= converter.historicToActual(region);
}
}
int startpos= region.getOffset();
int length= region.getLength();
return new SourceRange(startpos, length);
}
public String getSource() throws CModelException {
return null;
}
public ITranslationUnit getTranslationUnit() {
ICElement parent= fParent;
do {
if (parent instanceof ITranslationUnit) {
return (ITranslationUnit) parent;
}
parent= parent.getParent();
}
while (parent != null);
return null;
}
public void accept(ICElementVisitor visitor) throws CoreException {
}
public boolean exists() {
return true;
}
public ICElement getAncestor(int ancestorType) {
return null;
}
public ICModel getCModel() {
return fParent.getCModel();
}
public ICProject getCProject() {
return fParent.getCProject();
}
public String getElementName() {
return fName;
}
public int getElementType() {
return fType;
}
public ICElement getParent() {
return fParent;
}
public IPath getPath() {
return getTranslationUnit().getPath();
}
public URI getLocationURI() {
return getTranslationUnit().getLocationURI();
}
public IResource getResource() {
return getTranslationUnit().getResource();
}
public IResource getUnderlyingResource() {
return getResource();
}
public boolean isReadOnly() {
return true;
}
public boolean isStructureKnown() throws CModelException {
return false;
}
public void copy(ICElement container, ICElement sibling, String rename, boolean replace, IProgressMonitor monitor) throws CModelException {
}
public void delete(boolean force, IProgressMonitor monitor) throws CModelException {
}
public void move(ICElement container, ICElement sibling, String rename, boolean replace, IProgressMonitor monitor) throws CModelException {
}
public void rename(String name, boolean replace, IProgressMonitor monitor) throws CModelException {
}
public void setTypeName(String type) throws CModelException {
}
public String getTypeName() {
return ""; //$NON-NLS-1$
}
public ICElement[] getChildren() throws CModelException {
return NO_CHILDREN;
}
public List<ICElement> getChildrenOfType(int type) throws CModelException {
return Collections.emptyList();
}
public boolean hasChildren() {
return false;
}
public String[] getExceptions() {
return EMPTY_STRING_ARRAY;
}
public String getParameterInitializer(int pos) {
return ""; //$NON-NLS-1$
}
public boolean isConst() {
return false;
}
public boolean isVolatile() throws CModelException {
return false;
}
public boolean isFriend() throws CModelException {
return false;
}
public boolean isInline() throws CModelException {
return false;
}
public boolean isOperator() throws CModelException {
return false;
}
public boolean isPureVirtual() throws CModelException {
return false;
}
public boolean isVirtual() throws CModelException {
return false;
}
public boolean isMutable() throws CModelException {
return false;
}
public String getInitializer() {
return null;
}
public boolean isAbstract() throws CModelException {
return false;
}
public ASTAccessVisibility getSuperClassAccess(String name) {
return ASTAccessVisibility.PUBLIC;
}
public String[] getSuperClassesNames() {
return EMPTY_STRING_ARRAY;
}
protected String[] extractParameterTypes(IFunction func) {
IParameter[] params= func.getParameters();
String[] parameterTypes= new String[params.length];
for (int i = 0; i < params.length; i++) {
IParameter param = params[i];
parameterTypes[i]= ASTTypeUtil.getType(param.getType(), false);
}
if (parameterTypes.length == 1 && parameterTypes[0].equals("void")) { //$NON-NLS-1$
return EMPTY_STRING_ARRAY;
}
return parameterTypes;
}
protected ASTAccessVisibility getVisibility(IBinding binding) {
if (binding instanceof ICPPMember) {
ICPPMember member= (ICPPMember) binding;
switch (member.getVisibility()) {
case ICPPMember.v_private:
return ASTAccessVisibility.PRIVATE;
case ICPPMember.v_protected:
return ASTAccessVisibility.PROTECTED;
case ICPPMember.v_public:
return ASTAccessVisibility.PUBLIC;
}
}
return ASTAccessVisibility.PUBLIC;
}
/**
* @see ICElement
*/
public String getHandleIdentifier() {
ICElement cModelElement= mapToModelElement();
if (cModelElement != null) {
return cModelElement.getHandleIdentifier();
}
return null;
}
private ICElement mapToModelElement() {
try {
ISourceRange range= getSourceRange();
return getTranslationUnit().getElementAtOffset(range.getIdStartPos());
} catch (CModelException exc) {
return null;
}
}
public boolean isActive() {
return true;
}
public int getIndex() {
return fIndex;
}
}