1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

CModel: Extension to represent names from the index

This commit is contained in:
Markus Schorn 2006-11-22 12:44:33 +00:00
parent aa1849f26b
commit dd464d51a3
18 changed files with 844 additions and 46 deletions

View file

@ -28,11 +28,13 @@ Export-Package: org.eclipse.cdt.core,
org.eclipse.cdt.internal.core;x-friends:="org.eclipse.cdt.ui",
org.eclipse.cdt.internal.core.browser.util;x-internal:=true,
org.eclipse.cdt.internal.core.dom;x-friends:="org.eclipse.cdt.ui,org.eclipse.cdt.refactoring",
org.eclipse.cdt.internal.core.dom.bid,
org.eclipse.cdt.internal.core.dom.parser;x-friends:="org.eclipse.cdt.refactoring",
org.eclipse.cdt.internal.core.dom.parser.c;x-friends:="org.eclipse.cdt.refactoring",
org.eclipse.cdt.internal.core.dom.parser.cpp;x-friends:="org.eclipse.cdt.ui,org.eclipse.cdt.refactoring",
org.eclipse.cdt.internal.core.index;x-internal:=true,
org.eclipse.cdt.internal.core.model;x-friends:="org.eclipse.cdt.ui,org.eclipse.cdt.refactoring",
org.eclipse.cdt.internal.core.model.ext;x-friends:="org.eclipse.cdt.ui",
org.eclipse.cdt.internal.core.parser;x-internal:=true,
org.eclipse.cdt.internal.core.parser.ast;x-internal:=true,
org.eclipse.cdt.internal.core.parser.ast.complete;x-internal:=true,
@ -49,6 +51,7 @@ Export-Package: org.eclipse.cdt.core,
org.eclipse.cdt.internal.core.pdom.dom;x-friends:="org.eclipse.cdt.ui",
org.eclipse.cdt.internal.core.pdom.dom.c;x-internal:=true,
org.eclipse.cdt.internal.core.pdom.dom.cpp;x-internal:=true,
org.eclipse.cdt.internal.core.pdom.indexer;x-internal:=true,
org.eclipse.cdt.internal.core.pdom.indexer.fast;x-internal:=true,
org.eclipse.cdt.internal.core.pdom.indexer.full;x-internal:=true,
org.eclipse.cdt.internal.core.pdom.indexer.nulli;x-internal:=true,

View file

@ -234,24 +234,31 @@ public abstract class CElement extends PlatformObject implements ICElement {
public boolean equals (Object o) {
if (this == o)
return true;
if (o instanceof CElement) {
CElement other = (CElement) o;
if( fName == null || other.fName == null )
return false;
if( fName.length() == 0 || other.fName.length() == 0 )
return false;
if (fType != other.fType)
return false;
if (fName.equals(other.fName)) {
if (fParent != null && fParent.equals(other.fParent)) {
return true;
}
if (fParent == null && other.fParent == null)
return true;
}
if (o instanceof ICElement) {
return equals(this, (ICElement) o);
}
return false;
}
public static boolean equals(ICElement lhs, ICElement rhs) {
if (lhs.getElementType() != rhs.getElementType()) {
return false;
}
String lhsName= lhs.getElementName();
String rhsName= rhs.getElementName();
if( lhsName == null || rhsName == null || lhsName.length() == 0 ||
!lhsName.equals(rhsName)) {
return false;
}
ICElement lhsParent= lhs.getParent();
ICElement rhsParent= rhs.getParent();
if (lhsParent == rhsParent) {
return true;
}
return lhsParent != null && lhsParent.equals(rhsParent);
}
public CElementInfo getElementInfo() throws CModelException {
return getElementInfo(null);
@ -453,15 +460,22 @@ public abstract class CElement extends PlatformObject implements ICElement {
// CHECKPOINT: making not equal objects seem equal
// What elements should override this?
public int hashCode() {
if (fParent == null) return super.hashCode();
return Util.combineHashCodes(fName.hashCode(), fParent.hashCode());
return hashCode(this);
}
public static int hashCode(ICElement elem) {
ICElement parent= elem.getParent();
if (parent == null) {
return System.identityHashCode(elem);
}
return Util.combineHashCodes(elem.getElementName().hashCode(), parent.hashCode());
}
/*
* Test to see if two objects are identical
* Subclasses should override accordingly
*/
public boolean isIdentical( CElement otherElement){
public boolean isIdentical(CElement otherElement){
return this.equals(otherElement);
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2002, 2005 IBM Corporation and others.
* Copyright (c) 2002, 2006 IBM Corporation 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
@ -7,6 +7,7 @@
*
* Contributors:
* Rational Software - Initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.model;
@ -53,22 +54,32 @@ public class FunctionDeclaration extends SourceManipulation implements IFunction
}
public String getSignature() throws CModelException{
StringBuffer sig = new StringBuffer(getElementName());
sig.append(getParameterClause());
if(isConst())
sig.append(" const"); //$NON-NLS-1$
if(isVolatile()) {
sig.append(" volatile"); //$NON-NLS-1$
}
return getSignature(this);
}
public static String getSignature(IFunctionDeclaration func) {
StringBuffer sig = new StringBuffer(func.getElementName());
sig.append(getParameterClause(func.getParameterTypes()));
try {
if(func.isConst())
sig.append(" const"); //$NON-NLS-1$
if(func.isVolatile()) {
sig.append(" volatile"); //$NON-NLS-1$
}
} catch (CModelException e) {
}
return sig.toString();
}
public String getParameterClause(){
public String getParameterClause() {
return getParameterClause(getParameterTypes());
}
public static String getParameterClause(String[] paramTypes){
StringBuffer sig = new StringBuffer();
if(getNumberOfParameters() > 0){
if(paramTypes.length > 0){
sig.append("("); //$NON-NLS-1$
String[] paramTypes = getParameterTypes();
int i = 0;
sig.append(paramTypes[i++]);
while (i < paramTypes.length){
@ -100,14 +111,16 @@ public class FunctionDeclaration extends SourceManipulation implements IFunction
}
public boolean equals(Object other) {
// Two function declarations are equal if
// Their parents and names are equal and
return ( super.equals(other)
// their parameter types are equal and
&& Util.equalArraysOrNull(fParameterTypes, ((FunctionDeclaration)other).fParameterTypes)
// their return types are equal
&& getReturnType().equals(((FunctionDeclaration)other).getReturnType())
);
if (other instanceof IFunctionDeclaration) {
return equals(this, (IFunctionDeclaration) other);
}
return false;
}
public static boolean equals(IFunctionDeclaration lhs, IFunctionDeclaration rhs) {
return CElement.equals(lhs, rhs) &&
Util.equalArraysOrNull(lhs.getParameterTypes(), rhs.getParameterTypes()) &&
lhs.getReturnType().equals(rhs.getReturnType());
}
/**

View file

@ -7,6 +7,7 @@
*
* Contributors:
* Rational Software - Initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.model;
@ -111,16 +112,20 @@ public class MethodDeclaration extends FunctionDeclaration implements IMethodDec
return (MethodInfo) getElementInfo();
}
/*
* See if we need anything else to put in equals here
*/
public boolean equals(Object other) {
// Two methods are equal if
// their parents, names, parameter types and return types are equal and
return ( super.equals(other)
// their constant directive is the same
&& isConst() == ((MethodDeclaration)other).isConst()
);
if (other instanceof IMethodDeclaration) {
return equals(this, (IMethodDeclaration) other);
}
return false;
}
public static boolean equals(IMethodDeclaration lhs, IMethodDeclaration rhs) {
try {
return lhs.isConst() == rhs.isConst() &&
FunctionDeclaration.equals(lhs, rhs);
} catch (CModelException e) {
return false;
}
}

View file

@ -0,0 +1,277 @@
/*******************************************************************************
* Copyright (c) 2006 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
*******************************************************************************/
package org.eclipse.cdt.internal.core.model.ext;
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.DOMException;
import org.eclipse.cdt.core.dom.ast.IFunction;
import org.eclipse.cdt.core.dom.ast.IParameter;
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;
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;
public CElementHandle(ICElement parent, int type, String name) {
fParent= parent;
fType= type;
fName= name;
}
public boolean equals(Object obj) {
if (obj instanceof ICElement) {
return CElement.equals(this, (ICElement) obj);
}
return false;
}
public int hashCode() {
return CElement.hashCode(this);
}
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 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 getChildrenOfType(int type) throws CModelException {
return Collections.EMPTY_LIST;
}
public boolean hasChildren() {
return false;
}
public String[] getExceptions() {
return EMPTY_STRING_ARRAY;
}
public String getParameterInitializer(int pos) {
return ""; //$NON-NLS-1$
}
public String getReturnType() {
return ""; //$NON-NLS-1$
}
public boolean isConst() {
return false;
}
public boolean isStatic() throws CModelException {
return false;
}
public boolean isVolatile() throws CModelException {
return false;
}
public boolean isFriend() throws CModelException {
return false;
}
public boolean isConstructor() throws CModelException {
return false;
}
public boolean isDestructor() 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 ASTAccessVisibility getVisibility() throws CModelException {
return ASTAccessVisibility.PUBLIC;
}
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) throws DOMException {
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());
}
if (parameterTypes.length == 1 && parameterTypes[0].equals("void")) { //$NON-NLS-1$
return EMPTY_STRING_ARRAY;
}
return parameterTypes;
}
}

View file

@ -0,0 +1,111 @@
/*******************************************************************************
* Copyright (c) 2006 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
*******************************************************************************/
package org.eclipse.cdt.internal.core.model.ext;
import org.eclipse.cdt.core.dom.IName;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.ICompositeType;
import org.eclipse.cdt.core.dom.ast.IEnumerator;
import org.eclipse.cdt.core.dom.ast.IField;
import org.eclipse.cdt.core.dom.ast.IFunction;
import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.core.dom.ast.IVariable;
import org.eclipse.cdt.core.dom.ast.c.ICCompositeTypeScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceScope;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.text.IRegion;
/**
* Factory for creating CElement handles. These are a minimal implementation
* of the ICElement interface and can be used for displaying information about
* the index.
* @since 4.0
*/
public class CElementHandleFactory {
private CElementHandleFactory() {}
public static ICElement create(ITranslationUnit tu, IBinding binding,
IRegion region, long timestamp) throws CoreException, DOMException {
ICElement parentElement= create(tu, binding.getScope());
if (parentElement == null) {
return null;
}
CElementHandle element= null;
if (binding instanceof ICPPMethod) {
element= new MethodHandle(parentElement, (ICPPMethod) binding);
}
else if (binding instanceof IFunction) {
element= new FunctionHandle(parentElement, (IFunction) binding);
}
else if (binding instanceof IField) {
element= new FieldHandle(parentElement, (IField) binding);
}
else if (binding instanceof IVariable) {
element= new VariableHandle(parentElement, (IVariable) binding);
}
else if (binding instanceof IEnumerator) {
element= new EnumeratorHandle(parentElement, (IEnumerator) binding);
}
else if (binding instanceof ICompositeType) {
element= new StructureHandle(parentElement, (ICompositeType) binding);
}
else if (binding instanceof ICPPNamespace) {
element= new NamespaceHandle(parentElement, (ICPPNamespace) binding);
}
if (element != null && region != null) {
element.setRangeOfID(region, timestamp);
}
return element;
}
private static ICElement create(ITranslationUnit tu, IScope scope) throws DOMException {
if (scope == null) {
return tu;
}
IName scopeName= scope.getScopeName();
if (scopeName == null) {
if (scope.getParent() == null) {
return tu;
}
return null; // unnamed namespace
}
ICElement parentElement= create(tu, scope.getParent());
if (parentElement == null) {
return null;
}
CElementHandle element= null;
if (scope instanceof ICPPClassScope) {
ICPPClassType type= ((ICPPClassScope) scope).getClassType();
element= new StructureHandle(parentElement, type);
}
else if (scope instanceof ICCompositeTypeScope) {
ICompositeType type= ((ICCompositeTypeScope) scope).getCompositeType();
element= new StructureHandle(parentElement, type);
}
else if (scope instanceof ICPPNamespaceScope) {
element= new NamespaceHandle(parentElement, new String(scopeName.toCharArray()));
}
return element;
}
}

View file

@ -0,0 +1,22 @@
/*******************************************************************************
* Copyright (c) 2006 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
*******************************************************************************/
package org.eclipse.cdt.internal.core.model.ext;
import org.eclipse.cdt.core.dom.ast.IEnumeration;
import org.eclipse.cdt.core.model.ICElement;
public class EnumerationHandle extends CElementHandle implements org.eclipse.cdt.core.model.IEnumeration, ICElementHandle {
public EnumerationHandle(ICElement parent, IEnumeration enumeration) {
super(parent, ICElement.C_ENUMERATION, enumeration.getName());
}
}

View file

@ -0,0 +1,26 @@
/*******************************************************************************
* Copyright (c) 2006 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
*******************************************************************************/
package org.eclipse.cdt.internal.core.model.ext;
import org.eclipse.cdt.core.dom.ast.IEnumerator;
import org.eclipse.cdt.core.model.ICElement;
public class EnumeratorHandle extends CElementHandle implements org.eclipse.cdt.core.model.IEnumerator {
public EnumeratorHandle(ICElement parent, IEnumerator enumerator) {
super(parent, ICElement.C_ENUMERATOR, enumerator.getName());
}
public String getConstantExpression() {
return null;
}
}

View file

@ -0,0 +1,22 @@
/*******************************************************************************
* Copyright (c) 2006 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
*******************************************************************************/
package org.eclipse.cdt.internal.core.model.ext;
import org.eclipse.cdt.core.dom.ast.IField;
import org.eclipse.cdt.core.model.ICElement;
public class FieldHandle extends CElementHandle implements org.eclipse.cdt.core.model.IField {
public FieldHandle(ICElement parent, IField field) {
super(parent, ICElement.C_FIELD, field.getName());
}
}

View file

@ -0,0 +1,48 @@
/*******************************************************************************
* Copyright (c) 2006 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
*******************************************************************************/
package org.eclipse.cdt.internal.core.model.ext;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IFunction;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.IFunctionDeclaration;
import org.eclipse.cdt.internal.core.model.FunctionDeclaration;
public class FunctionHandle extends CElementHandle implements org.eclipse.cdt.core.model.IFunction {
private String[] fParameterTypes;
public FunctionHandle(ICElement parent, IFunction func) throws DOMException {
super(parent, ICElement.C_FUNCTION, func.getName());
fParameterTypes= extractParameterTypes(func);
}
public boolean equals(Object obj) {
if (obj instanceof IFunctionDeclaration) {
return FunctionDeclaration.equals(this, (IFunctionDeclaration) obj);
}
return false;
}
public int getNumberOfParameters() {
return fParameterTypes.length;
}
public String[] getParameterTypes() {
return fParameterTypes;
}
public String getSignature() throws CModelException {
return FunctionDeclaration.getSignature(this);
}
}

View file

@ -0,0 +1,17 @@
/*******************************************************************************
* Copyright (c) 2006 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
*******************************************************************************/
package org.eclipse.cdt.internal.core.model.ext;
import org.eclipse.cdt.core.model.ICElement;
public interface ICElementHandle extends ICElement {
}

View file

@ -0,0 +1,49 @@
/*******************************************************************************
* Copyright (c) 2006 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
*******************************************************************************/
package org.eclipse.cdt.internal.core.model.ext;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.IMethod;
import org.eclipse.cdt.core.model.IMethodDeclaration;
import org.eclipse.cdt.internal.core.model.FunctionDeclaration;
import org.eclipse.cdt.internal.core.model.MethodDeclaration;
public class MethodHandle extends CElementHandle implements IMethod {
private String[] fParameterTypes;
public MethodHandle(ICElement parent, ICPPMethod method) throws DOMException {
super(parent, ICElement.C_METHOD, method.getName());
fParameterTypes= extractParameterTypes(method);
}
public boolean equals(Object obj) {
if (obj instanceof IMethodDeclaration) {
return MethodDeclaration.equals(this, (IMethodDeclaration) obj);
}
return false;
}
public int getNumberOfParameters() {
return fParameterTypes.length;
}
public String[] getParameterTypes() {
return fParameterTypes;
}
public String getSignature() throws CModelException {
return FunctionDeclaration.getSignature(this);
}
}

View file

@ -0,0 +1,28 @@
/*******************************************************************************
* Copyright (c) 2006 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
*******************************************************************************/
package org.eclipse.cdt.internal.core.model.ext;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.INamespace;
public class NamespaceHandle extends CElementHandle implements INamespace {
public NamespaceHandle(ICElement parent, ICPPNamespace ns) throws DOMException {
super(parent, ICElement.C_NAMESPACE, ns.getName());
}
public NamespaceHandle(ICElement parent, String name) {
super(parent, ICElement.C_NAMESPACE, name);
}
}

View file

@ -0,0 +1,49 @@
/*******************************************************************************
* Copyright (c) 2006 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
*******************************************************************************/
package org.eclipse.cdt.internal.core.model.ext;
import org.eclipse.cdt.core.model.ISourceRange;
public class SourceRange implements ISourceRange {
private int fOffset;
private int fLength;
public SourceRange(int offset, int length) {
fOffset= offset;
fLength= length;
}
public int getEndLine() {
return -1;
}
public int getIdLength() {
return fLength;
}
public int getIdStartPos() {
return fOffset;
}
public int getLength() {
return fLength;
}
public int getStartLine() {
return -1;
}
public int getStartPos() {
return fOffset;
}
}

View file

@ -0,0 +1,67 @@
/*******************************************************************************
* Copyright (c) 2006 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
*******************************************************************************/
package org.eclipse.cdt.internal.core.model.ext;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.ICompositeType;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.IField;
import org.eclipse.cdt.core.model.IMethodDeclaration;
import org.eclipse.cdt.core.model.IStructure;
public class StructureHandle extends CElementHandle implements IStructure {
private static final IField[] EMPTY_FIELDS = new IField[0];
private static final IMethodDeclaration[] EMPTY_METHODS = new IMethodDeclaration[0];
public StructureHandle(ICElement parent, ICompositeType type) throws DOMException {
super(parent, convertKey(type.getKey()), type.getName());
}
private static int convertKey(int astKey) {
switch(astKey) {
case ICompositeType.k_struct:
return ICElement.C_STRUCT;
case ICompositeType.k_union:
return ICElement.C_UNION;
}
return ICElement.C_CLASS;
}
public IField getField(String name) {
return null;
}
public IField[] getFields() throws CModelException {
return EMPTY_FIELDS;
}
public IMethodDeclaration getMethod(String name) {
return null;
}
public IMethodDeclaration[] getMethods() throws CModelException {
return EMPTY_METHODS;
}
public boolean isClass() throws CModelException {
return getElementType() == ICElement.C_CLASS;
}
public boolean isStruct() throws CModelException {
return getElementType() == ICElement.C_STRUCT;
}
public boolean isUnion() throws CModelException {
return getElementType() == ICElement.C_UNION;
}
}

View file

@ -0,0 +1,21 @@
/*******************************************************************************
* Copyright (c) 2006 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
*******************************************************************************/
package org.eclipse.cdt.internal.core.model.ext;
import org.eclipse.cdt.core.dom.ast.IVariable;
import org.eclipse.cdt.core.model.ICElement;
public class VariableHandle extends CElementHandle implements org.eclipse.cdt.core.model.IVariable {
public VariableHandle(ICElement parent, IVariable var) {
super(parent, ICElement.C_VARIABLE, var.getName());
}
}

View file

@ -11,6 +11,7 @@
package org.eclipse.cdt.core;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IPath;
@ -30,6 +31,15 @@ import org.eclipse.core.runtime.IPath;
* @since 4.0
*/
public interface IPositionTrackerManager {
/**
* Returns the position converter suitable for mapping character offsets of the
* given translation unit to the current version of it.
*
* @param file a file for which the position adapter is requested.
* @param timestamp identifies the version of the file stored on disk.
* @return the requested position converter or <code>null</code>.
*/
public IPositionConverter findPositionConverter(ITranslationUnit tu, long timestamp);
/**
* Returns the position converter suitable for mapping character offsets of the
* given file/timestamp to the current version of it.

View file

@ -20,6 +20,7 @@ import java.util.TreeMap;
import org.eclipse.cdt.core.IPositionConverter;
import org.eclipse.cdt.core.IPositionTrackerManager;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.core.filebuffers.FileBuffers;
import org.eclipse.core.filebuffers.IFileBuffer;
import org.eclipse.core.filebuffers.IFileBufferListener;
@ -189,4 +190,19 @@ public class PositionTrackerManager implements IPositionTrackerManager, IFileBuf
}
return null;
}
/**
* {@inheritDoc}
*/
public synchronized IPositionConverter findPositionConverter(ITranslationUnit tu, long timestamp) {
IFile file= (IFile) tu.getResource();
if (file != null) {
return findPositionConverter(file, timestamp);
}
IPath location= tu.getLocation();
if (location != null) {
return findPositionConverter(location, timestamp);
}
return null;
}
}