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

Added toString methods.

This commit is contained in:
Sergey Prigogin 2008-03-08 23:00:47 +00:00
parent 934ea2e952
commit 7cdbcfc0f9
3 changed files with 263 additions and 185 deletions

View file

@ -12,6 +12,9 @@
*******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.cpp;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IField;
@ -25,6 +28,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPDeferredTemplateInstance;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPField;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.core.parser.util.ObjectMap;
@ -201,6 +205,63 @@ public class CPPClassInstance extends CPPInstance implements ICPPClassType, ICPP
return ICPPMethod.EMPTY_CPPMETHOD_ARRAY;
}
/**
* Returns a combined argument map of this class and all its base template classes.
* This combined map helps with instantiation of members of template classes that subclass
* other template classes (see AST2TemplateTests#testRebindPattern_214017_2()).
*/
@Override
public ObjectMap getArgumentMap() {
ObjectMap argMap = argumentMap;
List<ICPPSpecialization> bases = null;
try {
for (ICPPBase base : getBases()) {
IBinding baseClass = base.getBaseClass();
if (baseClass instanceof ICPPSpecialization) {
if (bases == null) {
bases = new ArrayList<ICPPSpecialization>();
}
bases.add((ICPPSpecialization) baseClass);
}
}
if (bases != null) {
for (int i = 0; i < bases.size(); i++) {
for (ICPPBase base : ((ICPPClassType) bases.get(i)).getBases()) {
IBinding baseClass = base.getBaseClass();
if (baseClass instanceof ICPPSpecialization) {
bases.add((ICPPSpecialization) baseClass);
}
}
if (bases.size() > 20) { // Protect against cyclic inheritance.
break;
}
}
}
} catch (DOMException e) {
// Ignore
}
if (bases != null) {
for (ICPPSpecialization base : bases) {
// Protect against infinite recursion.
ObjectMap baseArgMap = base instanceof CPPClassInstance ?
((CPPClassInstance) base).argumentMap : base.getArgumentMap();
if (!baseArgMap.isEmpty()) {
if (argMap == argumentMap) {
argMap = (ObjectMap) argumentMap.clone();
}
for (int i = 0; i < baseArgMap.size(); i++) {
Object key = baseArgMap.keyAt(i);
if (!argMap.containsKey(key)) {
argMap.put(key, baseArgMap.getAt(i));
}
}
}
}
}
return argMap;
}
@Override
public boolean equals(Object obj) {
return obj instanceof ICPPClassType && isSameType((ICPPClassType) obj);

View file

@ -12,6 +12,7 @@
package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.dom.ast.ASTTypeUtil;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
@ -47,57 +48,57 @@ import org.eclipse.core.runtime.PlatformObject;
public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInternalFunction {
public static class CPPFunctionProblem extends ProblemBinding implements ICPPFunction {
public CPPFunctionProblem( IASTNode node, int id, char[] arg ) {
super( node, id, arg );
public CPPFunctionProblem(IASTNode node, int id, char[] arg) {
super(node, id, arg);
}
public IParameter[] getParameters() throws DOMException {
throw new DOMException( this );
throw new DOMException(this);
}
public IScope getFunctionScope() throws DOMException {
throw new DOMException( this );
throw new DOMException(this);
}
public IFunctionType getType() throws DOMException {
throw new DOMException( this );
throw new DOMException(this);
}
public boolean isStatic() throws DOMException {
throw new DOMException( this );
throw new DOMException(this);
}
public String[] getQualifiedName() throws DOMException {
throw new DOMException( this );
throw new DOMException(this);
}
public char[][] getQualifiedNameCharArray() throws DOMException {
throw new DOMException( this );
throw new DOMException(this);
}
public boolean isGloballyQualified() throws DOMException {
throw new DOMException( this );
throw new DOMException(this);
}
public boolean isMutable() throws DOMException {
throw new DOMException( this );
throw new DOMException(this);
}
public boolean isInline() throws DOMException {
throw new DOMException( this );
throw new DOMException(this);
}
public boolean isExternC() throws DOMException {
throw new DOMException( this );
throw new DOMException(this);
}
public boolean isExtern() throws DOMException {
throw new DOMException( this );
throw new DOMException(this);
}
public boolean isAuto() throws DOMException {
throw new DOMException( this );
throw new DOMException(this);
}
public boolean isRegister() throws DOMException {
throw new DOMException( this );
throw new DOMException(this);
}
public boolean takesVarArgs() throws DOMException {
throw new DOMException( this );
throw new DOMException(this);
}
}
protected ICPPASTFunctionDeclarator [] declarations;
protected ICPPASTFunctionDeclarator[] declarations;
protected ICPPASTFunctionDeclarator definition;
protected IFunctionType type = null;
@ -105,28 +106,28 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
private static final int RESOLUTION_IN_PROGRESS = 1 << 1;
private int bits = 0;
public CPPFunction( ICPPASTFunctionDeclarator declarator ){
if( declarator != null ) {
public CPPFunction(ICPPASTFunctionDeclarator declarator) {
if (declarator != null) {
IASTNode parent = declarator.getParent();
if( parent instanceof IASTFunctionDefinition )
if (parent instanceof IASTFunctionDefinition)
definition = declarator;
else
declarations = new ICPPASTFunctionDeclarator [] { declarator };
declarations = new ICPPASTFunctionDeclarator[] { declarator };
IASTName name= getASTName();
name.setBinding( this );
name.setBinding(this);
}
}
private void resolveAllDeclarations(){
if( (bits & (FULLY_RESOLVED | RESOLUTION_IN_PROGRESS)) == 0 ){
private void resolveAllDeclarations() {
if ((bits & (FULLY_RESOLVED | RESOLUTION_IN_PROGRESS)) == 0) {
bits |= RESOLUTION_IN_PROGRESS;
IASTTranslationUnit tu = null;
if( definition != null )
if (definition != null) {
tu = definition.getTranslationUnit();
else if( declarations != null )
} else if (declarations != null) {
tu = declarations[0].getTranslationUnit();
else {
} else {
//implicit binding
IScope scope = getScope();
try {
@ -134,13 +135,14 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
if (node != null) {
tu = node.getTranslationUnit();
}
} catch ( DOMException e ) {
} catch (DOMException e) {
}
}
if( tu != null ){
CPPVisitor.getDeclarations( tu, this );
if (tu != null) {
CPPVisitor.getDeclarations(tu, this);
}
declarations = (ICPPASTFunctionDeclarator[]) ArrayUtil.trim( ICPPASTFunctionDeclarator.class, declarations );
declarations = (ICPPASTFunctionDeclarator[]) ArrayUtil.trim(ICPPASTFunctionDeclarator.class,
declarations);
bits |= FULLY_RESOLVED;
bits &= ~RESOLUTION_IN_PROGRESS;
}
@ -160,46 +162,48 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
return definition;
}
public void addDefinition( IASTNode node ){
if( node instanceof IASTName )
public void addDefinition(IASTNode node) {
if (node instanceof IASTName)
node = node.getParent();
if( !(node instanceof ICPPASTFunctionDeclarator) )
if (!(node instanceof ICPPASTFunctionDeclarator))
return;
ICPPASTFunctionDeclarator dtor = (ICPPASTFunctionDeclarator) node;
updateParameterBindings( dtor );
updateParameterBindings(dtor);
definition = dtor;
}
public void addDeclaration( IASTNode node ){
if( node instanceof IASTName )
public void addDeclaration(IASTNode node) {
if (node instanceof IASTName)
node = node.getParent();
if( !(node instanceof ICPPASTFunctionDeclarator) )
if (!(node instanceof ICPPASTFunctionDeclarator))
return;
ICPPASTFunctionDeclarator dtor = (ICPPASTFunctionDeclarator) node;
updateParameterBindings( dtor );
updateParameterBindings(dtor);
if( declarations == null ){
declarations = new ICPPASTFunctionDeclarator [] { dtor };
if (declarations == null) {
declarations = new ICPPASTFunctionDeclarator[] { dtor };
return;
}
//keep the lowest offset declaration in [0]
if( declarations.length > 0 && ((ASTNode)node).getOffset() < ((ASTNode)declarations[0]).getOffset() ){
declarations = (ICPPASTFunctionDeclarator[]) ArrayUtil.prepend( ICPPASTFunctionDeclarator.class, declarations, dtor );
// Keep the lowest offset declaration in [0]
if (declarations.length > 0 && ((ASTNode)node).getOffset() < ((ASTNode)declarations[0]).getOffset()) {
declarations = (ICPPASTFunctionDeclarator[]) ArrayUtil.prepend(ICPPASTFunctionDeclarator.class,
declarations, dtor);
} else {
declarations = (ICPPASTFunctionDeclarator[]) ArrayUtil.append( ICPPASTFunctionDeclarator.class, declarations, dtor );
declarations = (ICPPASTFunctionDeclarator[]) ArrayUtil.append(ICPPASTFunctionDeclarator.class,
declarations, dtor);
}
}
public void removeDeclaration(IASTNode node) {
while( node instanceof IASTName ){
while (node instanceof IASTName) {
node = node.getParent();
}
if( definition == node ){
if (definition == node) {
definition = null;
return;
}
if( declarations != null ) {
if (declarations != null) {
ArrayUtil.remove(declarations, node);
}
}
@ -207,13 +211,13 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IFunction#getParameters()
*/
public IParameter [] getParameters() {
IASTStandardFunctionDeclarator dtor = ( definition != null ) ? definition : declarations[0];
public IParameter[] getParameters() {
IASTStandardFunctionDeclarator dtor = (definition != null) ? definition : declarations[0];
IASTParameterDeclaration[] params = dtor.getParameters();
int size = params.length;
IParameter [] result = new IParameter[ size ];
if( size > 0 ){
for( int i = 0; i < size; i++ ){
IParameter[] result = new IParameter[ size ];
if (size > 0) {
for (int i = 0; i < size; i++) {
IASTParameterDeclaration p = params[i];
final IASTName name = p.getDeclarator().getName();
final IBinding binding= name.resolveBinding();
@ -221,7 +225,8 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
result[i]= (IParameter) binding;
}
else {
result[i] = new CPPParameter.CPPParameterProblem(p, IProblemBinding.SEMANTIC_INVALID_TYPE, name.toCharArray());
result[i] = new CPPParameter.CPPParameterProblem(p, IProblemBinding.SEMANTIC_INVALID_TYPE,
name.toCharArray());
}
}
}
@ -233,7 +238,7 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
*/
public IScope getFunctionScope() {
resolveAllDeclarations();
if( definition != null ){
if (definition != null) {
return definition.getFunctionScope();
}
@ -255,15 +260,15 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
}
private IASTName getASTName() {
IASTDeclarator dtor = ( definition != null ) ? definition : declarations[0];
IASTDeclarator dtor = (definition != null) ? definition : declarations[0];
IASTDeclarator nested= dtor.getNestedDeclarator();
while (nested != null) {
dtor= nested;
nested= nested.getNestedDeclarator();
}
IASTName name= dtor.getName();
if( name instanceof ICPPASTQualifiedName ){
IASTName [] ns = ((ICPPASTQualifiedName)name).getNames();
if (name instanceof ICPPASTQualifiedName) {
IASTName[] ns = ((ICPPASTQualifiedName)name).getNames();
name = ns[ ns.length - 1 ];
}
return name;
@ -274,29 +279,29 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
* @see org.eclipse.cdt.core.dom.ast.IBinding#getScope()
*/
public IScope getScope() {
IASTName n= getASTName();
IScope scope = CPPVisitor.getContainingScope( n );
if( scope instanceof ICPPClassScope ){
IASTName n = getASTName();
IScope scope = CPPVisitor.getContainingScope(n);
if (scope instanceof ICPPClassScope) {
ICPPASTDeclSpecifier declSpec = null;
if( definition != null ){
if (definition != null) {
IASTNode node = definition.getParent();
while( node instanceof IASTDeclarator )
while (node instanceof IASTDeclarator)
node = node.getParent();
IASTFunctionDefinition def = (IASTFunctionDefinition) node;
declSpec = (ICPPASTDeclSpecifier) def.getDeclSpecifier();
} else {
IASTNode node = declarations[0].getParent();
while( node instanceof IASTDeclarator )
while (node instanceof IASTDeclarator)
node = node.getParent();
IASTSimpleDeclaration decl = (IASTSimpleDeclaration)node;
declSpec = (ICPPASTDeclSpecifier) decl.getDeclSpecifier();
}
if( declSpec.isFriend() ) {
if (declSpec.isFriend()) {
try {
while( scope instanceof ICPPClassScope ){
while (scope instanceof ICPPClassScope) {
scope = scope.getParent();
}
} catch ( DOMException e ) {
} catch (DOMException e) {
}
}
}
@ -307,51 +312,51 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
* @see org.eclipse.cdt.core.dom.ast.IFunction#getType()
*/
public IFunctionType getType() {
if( type == null )
type = (IFunctionType) CPPVisitor.createType( ( definition != null ) ? definition : declarations[0] );
if (type == null)
type = (IFunctionType) CPPVisitor.createType((definition != null) ? definition : declarations[0]);
return type;
}
public IBinding resolveParameter( IASTParameterDeclaration param ){
public IBinding resolveParameter(IASTParameterDeclaration param) {
IASTDeclarator dtor = param.getDeclarator();
while( dtor.getNestedDeclarator() != null )
while (dtor.getNestedDeclarator() != null)
dtor = dtor.getNestedDeclarator();
IASTName name = dtor.getName();
IBinding binding = name.getBinding();
if( binding != null )
if (binding != null)
return binding;
IASTStandardFunctionDeclarator fdtor = (IASTStandardFunctionDeclarator) param.getParent();
IASTParameterDeclaration [] ps = fdtor.getParameters();
IASTParameterDeclaration[] ps = fdtor.getParameters();
int i = 0;
for( ; i < ps.length; i++ ){
if( param == ps[i] )
for (; i < ps.length; i++) {
if (param == ps[i])
break;
}
//create a new binding and set it for the corresponding parameter in all known defns and decls
binding = new CPPParameter( name );
binding = new CPPParameter(name);
IASTParameterDeclaration temp = null;
if( definition != null ){
if (definition != null) {
IASTParameterDeclaration[] paramDecls = definition.getParameters();
if (paramDecls.length > i) { // This will be less than i if we have a void parameter
temp = paramDecls[i];
IASTName n = temp.getDeclarator().getName();
if( n != name ) {
n.setBinding( binding );
((CPPParameter)binding).addDeclaration( n );
if (n != name) {
n.setBinding(binding);
((CPPParameter)binding).addDeclaration(n);
}
}
}
if( declarations != null ){
for( int j = 0; j < declarations.length && declarations[j] != null; j++ ){
IASTParameterDeclaration [] paramDecls = declarations[j].getParameters();
if( paramDecls.length > i ) {
if (declarations != null) {
for (int j = 0; j < declarations.length && declarations[j] != null; j++) {
IASTParameterDeclaration[] paramDecls = declarations[j].getParameters();
if (paramDecls.length > i) {
temp = paramDecls[i];
IASTName n = temp.getDeclarator().getName();
if( n != name ) {
n.setBinding( binding );
((CPPParameter)binding).addDeclaration( n );
if (n != name) {
n.setBinding(binding);
((CPPParameter)binding).addDeclaration(n);
}
}
}
@ -359,20 +364,20 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
return binding;
}
protected void updateParameterBindings( ICPPASTFunctionDeclarator fdtor ){
protected void updateParameterBindings(ICPPASTFunctionDeclarator fdtor) {
ICPPASTFunctionDeclarator orig = definition != null ? definition : declarations[0];
IASTParameterDeclaration [] ops = orig.getParameters();
IASTParameterDeclaration [] nps = fdtor.getParameters();
IASTParameterDeclaration[] ops = orig.getParameters();
IASTParameterDeclaration[] nps = fdtor.getParameters();
CPPParameter temp = null;
for( int i = 0; i < ops.length; i++ ){
for (int i = 0; i < ops.length; i++) {
temp = (CPPParameter) ops[i].getDeclarator().getName().getBinding();
if( temp != null && nps.length > i ){ //length could be different, ie 0 or 1 with void
if (temp != null && nps.length > i) { //length could be different, ie 0 or 1 with void
IASTDeclarator dtor = nps[i].getDeclarator();
while( dtor.getNestedDeclarator() != null )
while (dtor.getNestedDeclarator() != null)
dtor = dtor.getNestedDeclarator();
IASTName name = dtor.getName();
name.setBinding( temp );
temp.addDeclaration( name );
name.setBinding(temp);
temp.addDeclaration(name);
}
}
}
@ -380,41 +385,41 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IFunction#isStatic()
*/
public boolean isStatic( ) {
return isStatic( true );
public boolean isStatic() {
return isStatic(true);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalFunction#isStatic(boolean)
*/
public boolean isStatic( boolean resolveAll ) {
if( resolveAll && (bits & FULLY_RESOLVED) == 0 ){
public boolean isStatic(boolean resolveAll) {
if (resolveAll && (bits & FULLY_RESOLVED) == 0) {
resolveAllDeclarations();
}
return hasStorageClass( this, IASTDeclSpecifier.sc_static );
return hasStorageClass(this, IASTDeclSpecifier.sc_static);
}
// }
// static public boolean isStatic
// //2 state bits, most significant = whether or not we've figure this out yet
// //least significant = whether or not we are static
// int state = ( bits & IS_STATIC ) >> 2;
// if( state > 1 ) return (state % 2 != 0);
// int state = (bits & IS_STATIC) >> 2;
// if (state > 1) return (state % 2 != 0);
//
// IASTDeclSpecifier declSpec = null;
// IASTFunctionDeclarator dtor = (IASTFunctionDeclarator) getDefinition();
// if( dtor != null ){
// if (dtor != null) {
// declSpec = ((IASTFunctionDefinition)dtor.getParent()).getDeclSpecifier();
// if( declSpec.getStorageClass() == IASTDeclSpecifier.sc_static ){
// if (declSpec.getStorageClass() == IASTDeclSpecifier.sc_static) {
// bits |= 3 << 2;
// return true;
// }
// }
//
// IASTFunctionDeclarator[] dtors = (IASTFunctionDeclarator[]) getDeclarations();
// if( dtors != null ) {
// for( int i = 0; i < dtors.length; i++ ){
// if (dtors != null) {
// for (int i = 0; i < dtors.length; i++) {
// IASTNode parent = dtors[i].getParent();
// declSpec = ((IASTSimpleDeclaration)parent).getDeclSpecifier();
// if( declSpec.getStorageClass() == IASTDeclSpecifier.sc_static ){
// if (declSpec.getStorageClass() == IASTDeclSpecifier.sc_static) {
// bits |= 3 << 2;
// return true;
// }
@ -428,14 +433,14 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
* @see org.eclipse.cdt.core.dom.ast.IBinding#getFullyQualifiedName()
*/
public String[] getQualifiedName() {
return CPPVisitor.getQualifiedName( this );
return CPPVisitor.getQualifiedName(this);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IBinding#getFullyQualifiedNameCharArray()
*/
public char[][] getQualifiedNameCharArray() {
return CPPVisitor.getQualifiedNameCharArray( this );
return CPPVisitor.getQualifiedNameCharArray(this);
}
/* (non-Javadoc)
@ -443,40 +448,41 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
*/
public boolean isGloballyQualified() throws DOMException {
IScope scope = getScope();
while( scope != null ){
if( scope instanceof ICPPBlockScope )
while (scope != null) {
if (scope instanceof ICPPBlockScope)
return false;
scope = scope.getParent();
}
return true;
}
static public boolean hasStorageClass( ICPPInternalFunction function, int storage){
static public boolean hasStorageClass(ICPPInternalFunction function, int storage) {
ICPPASTFunctionDeclarator dtor = (ICPPASTFunctionDeclarator) function.getDefinition();
IASTNode[] ds = function.getDeclarations();
int i = -1;
do{
if( dtor != null ){
do {
if (dtor != null) {
IASTNode parent = dtor.getParent();
while( !(parent instanceof IASTDeclaration) )
while (!(parent instanceof IASTDeclaration))
parent = parent.getParent();
IASTDeclSpecifier declSpec = null;
if( parent instanceof IASTSimpleDeclaration )
if (parent instanceof IASTSimpleDeclaration) {
declSpec = ((IASTSimpleDeclaration)parent).getDeclSpecifier();
else if( parent instanceof IASTFunctionDefinition )
} else if (parent instanceof IASTFunctionDefinition) {
declSpec = ((IASTFunctionDefinition)parent).getDeclSpecifier();
if( declSpec.getStorageClass() == storage ) {
}
if (declSpec.getStorageClass() == storage) {
return true;
}
}
if( ds != null && ++i < ds.length ) {
if (ds != null && ++i < ds.length) {
dtor = (ICPPASTFunctionDeclarator) ds[i];
}
else
} else {
break;
} while( dtor != null );
}
} while (dtor != null);
return false;
}
@ -494,26 +500,26 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
ICPPASTFunctionDeclarator dtor = (ICPPASTFunctionDeclarator) getDefinition();
ICPPASTFunctionDeclarator[] ds = (ICPPASTFunctionDeclarator[]) getDeclarations();
int i = -1;
do{
if( dtor != null ){
do {
if (dtor != null) {
IASTNode parent = dtor.getParent();
while( !(parent instanceof IASTDeclaration) )
while (!(parent instanceof IASTDeclaration))
parent = parent.getParent();
IASTDeclSpecifier declSpec = null;
if( parent instanceof IASTSimpleDeclaration )
if (parent instanceof IASTSimpleDeclaration)
declSpec = ((IASTSimpleDeclaration)parent).getDeclSpecifier();
else if( parent instanceof IASTFunctionDefinition )
else if (parent instanceof IASTFunctionDefinition)
declSpec = ((IASTFunctionDefinition)parent).getDeclSpecifier();
if( declSpec.isInline() )
if (declSpec.isInline())
return true;
}
if( ds != null && ++i < ds.length )
if (ds != null && ++i < ds.length)
dtor = ds[i];
else
break;
} while( dtor != null );
} while (dtor != null);
return false;
}
@ -539,21 +545,21 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
* @see org.eclipse.cdt.core.dom.ast.IFunction#isExtern()
*/
public boolean isExtern() {
return hasStorageClass( this, IASTDeclSpecifier.sc_extern );
return hasStorageClass(this, IASTDeclSpecifier.sc_extern);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IFunction#isAuto()
*/
public boolean isAuto() {
return hasStorageClass( this, IASTDeclSpecifier.sc_auto );
return hasStorageClass(this, IASTDeclSpecifier.sc_auto);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IFunction#isRegister()
*/
public boolean isRegister() {
return hasStorageClass( this, IASTDeclSpecifier.sc_register );
return hasStorageClass(this, IASTDeclSpecifier.sc_register);
}
/* (non-Javadoc)
@ -561,11 +567,11 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
*/
public boolean takesVarArgs() {
ICPPASTFunctionDeclarator dtor = (ICPPASTFunctionDeclarator) getDefinition();
if( dtor != null ){
if (dtor != null) {
return dtor.takesVarArgs();
}
ICPPASTFunctionDeclarator [] ds = (ICPPASTFunctionDeclarator[]) getDeclarations();
if( ds != null && ds.length > 0 ){
ICPPASTFunctionDeclarator[] ds = (ICPPASTFunctionDeclarator[]) getDeclarations();
if (ds != null && ds.length > 0) {
return ds[0].takesVarArgs();
}
return false;
@ -574,4 +580,9 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
public ILinkage getLinkage() {
return Linkage.CPP_LINKAGE;
}
@Override
public String toString() {
return getName() + ASTTypeUtil.getParameterTypeString(getType()); //$NON-NLS-1$
}
}

View file

@ -35,38 +35,38 @@ import org.eclipse.core.runtime.PlatformObject;
*/
public class CPPParameter extends PlatformObject implements ICPPParameter, ICPPInternalBinding {
public static class CPPParameterProblem extends ProblemBinding implements ICPPParameter {
public CPPParameterProblem( IASTNode node, int id, char[] arg ) {
super( node, id, arg );
public CPPParameterProblem(IASTNode node, int id, char[] arg) {
super(node, id, arg);
}
public IType getType() throws DOMException {
throw new DOMException( this );
throw new DOMException(this);
}
public boolean isStatic() throws DOMException {
throw new DOMException( this );
throw new DOMException(this);
}
public boolean isExtern() throws DOMException {
throw new DOMException( this );
throw new DOMException(this);
}
public boolean isAuto() throws DOMException {
throw new DOMException( this );
throw new DOMException(this);
}
public boolean isRegister() throws DOMException {
throw new DOMException( this );
throw new DOMException(this);
}
public boolean hasDefaultValue() {
return false;
}
public boolean isMutable() throws DOMException {
throw new DOMException( this );
throw new DOMException(this);
}
public String[] getQualifiedName() throws DOMException {
throw new DOMException( this );
throw new DOMException(this);
}
public char[][] getQualifiedNameCharArray() throws DOMException {
throw new DOMException( this );
throw new DOMException(this);
}
public boolean isGloballyQualified() throws DOMException {
throw new DOMException( this );
throw new DOMException(this);
}
public boolean isExternC() {
return false;
@ -74,14 +74,14 @@ public class CPPParameter extends PlatformObject implements ICPPParameter, ICPPI
}
private IType type = null;
private IASTName [] declarations = null;
private IASTName[] declarations = null;
public CPPParameter( IASTName name ){
this.declarations = new IASTName [] { name };
public CPPParameter(IASTName name) {
this.declarations = new IASTName[] { name };
}
public CPPParameter( IType type ){
public CPPParameter(IType type) {
this.type = type;
}
@ -99,18 +99,18 @@ public class CPPParameter extends PlatformObject implements ICPPParameter, ICPPI
return null;
}
public void addDeclaration( IASTNode node ){
if( !(node instanceof IASTName ) )
public void addDeclaration(IASTNode node) {
if (!(node instanceof IASTName))
return;
IASTName name = (IASTName) node;
if( declarations == null )
if (declarations == null) {
declarations = new IASTName[] { name };
else {
//keep the lowest offset declaration in [0]
if( declarations.length > 0 && ((ASTNode)node).getOffset() < ((ASTNode)declarations[0]).getOffset() ){
declarations = (IASTName[]) ArrayUtil.prepend( IASTName.class, declarations, name );
} else {
//keep the lowest offset declaration in[0]
if (declarations.length > 0 && ((ASTNode)node).getOffset() < ((ASTNode)declarations[0]).getOffset()) {
declarations = (IASTName[]) ArrayUtil.prepend(IASTName.class, declarations, name);
} else {
declarations = (IASTName[]) ArrayUtil.append( IASTName.class, declarations, name );
declarations = (IASTName[]) ArrayUtil.append(IASTName.class, declarations, name);
}
}
}
@ -119,14 +119,14 @@ public class CPPParameter extends PlatformObject implements ICPPParameter, ICPPI
ArrayUtil.remove(declarations, node);
}
private IASTName getPrimaryDeclaration(){
if( declarations != null ){
for( int i = 0; i < declarations.length && declarations[i] != null; i++ ){
private IASTName getPrimaryDeclaration() {
if (declarations != null) {
for (int i = 0; i < declarations.length && declarations[i] != null; i++) {
IASTNode node = declarations[i].getParent();
while( !(node instanceof IASTDeclaration) )
while (!(node instanceof IASTDeclaration))
node = node.getParent();
if( node instanceof IASTFunctionDefinition )
if (node instanceof IASTFunctionDefinition)
return declarations[i];
}
return declarations[0];
@ -138,7 +138,7 @@ public class CPPParameter extends PlatformObject implements ICPPParameter, ICPPI
*/
public String getName() {
IASTName name = getPrimaryDeclaration();
if( name != null )
if (name != null)
return name.toString();
return CPPSemantics.EMPTY_NAME;
}
@ -148,7 +148,7 @@ public class CPPParameter extends PlatformObject implements ICPPParameter, ICPPI
*/
public char[] getNameCharArray() {
IASTName name = getPrimaryDeclaration();
if( name != null )
if (name != null)
return name.toCharArray();
return CPPSemantics.EMPTY_NAME_ARRAY;
}
@ -157,14 +157,14 @@ public class CPPParameter extends PlatformObject implements ICPPParameter, ICPPI
* @see org.eclipse.cdt.core.dom.ast.IBinding#getScope()
*/
public IScope getScope() {
return CPPVisitor.getContainingScope( getPrimaryDeclaration() );
return CPPVisitor.getContainingScope(getPrimaryDeclaration());
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IBinding#getPhysicalNode()
*/
public IASTNode getPhysicalNode() {
if( declarations != null )
if (declarations != null)
return declarations[0];
return null;
}
@ -173,8 +173,8 @@ public class CPPParameter extends PlatformObject implements ICPPParameter, ICPPI
* @see org.eclipse.cdt.core.dom.ast.IVariable#getType()
*/
public IType getType() {
if( type == null && declarations != null ){
type = CPPVisitor.createType( (IASTDeclarator) declarations[0].getParent() );
if (type == null && declarations != null) {
type = CPPVisitor.createType((IASTDeclarator) declarations[0].getParent());
}
return type;
}
@ -190,14 +190,14 @@ public class CPPParameter extends PlatformObject implements ICPPParameter, ICPPI
* @see org.eclipse.cdt.core.dom.ast.IBinding#getFullyQualifiedName()
*/
public String[] getQualifiedName() {
return new String [] { getName() };
return new String[] { getName() };
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IBinding#getFullyQualifiedNameCharArray()
*/
public char[][] getQualifiedNameCharArray() {
return new char[][]{ getNameCharArray() };
return new char[][] { getNameCharArray() };
}
/* (non-Javadoc)
@ -211,7 +211,7 @@ public class CPPParameter extends PlatformObject implements ICPPParameter, ICPPI
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#addDefinition(org.eclipse.cdt.core.dom.ast.IASTNode)
*/
public void addDefinition(IASTNode node) {
addDeclaration( node );
addDeclaration(node);
}
/* (non-Javadoc)
@ -234,29 +234,29 @@ public class CPPParameter extends PlatformObject implements ICPPParameter, ICPPI
* @see org.eclipse.cdt.core.dom.ast.IVariable#isAuto()
*/
public boolean isAuto() {
return hasStorageClass( IASTDeclSpecifier.sc_auto );
return hasStorageClass(IASTDeclSpecifier.sc_auto);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IVariable#isRegister()
*/
public boolean isRegister() {
return hasStorageClass( IASTDeclSpecifier.sc_register );
return hasStorageClass(IASTDeclSpecifier.sc_register);
}
public boolean hasStorageClass( int storage ){
public boolean hasStorageClass(int storage) {
IASTNode[] ns = getDeclarations();
if( ns == null )
if (ns == null)
return false;
for( int i = 0; i < ns.length && ns[i] != null; i++ ){
for (int i = 0; i < ns.length && ns[i] != null; i++) {
IASTNode parent = ns[i].getParent();
while( !(parent instanceof IASTDeclaration) )
while (!(parent instanceof IASTDeclaration))
parent = parent.getParent();
if( parent instanceof IASTSimpleDeclaration ){
if (parent instanceof IASTSimpleDeclaration) {
IASTDeclSpecifier declSpec = ((IASTSimpleDeclaration)parent).getDeclSpecifier();
if( declSpec.getStorageClass() == storage )
if (declSpec.getStorageClass() == storage)
return true;
}
}
@ -264,14 +264,14 @@ public class CPPParameter extends PlatformObject implements ICPPParameter, ICPPI
}
public IASTInitializer getDefaultValue() {
if( declarations == null )
if (declarations == null)
return null;
for (int i = 0; i < declarations.length && declarations[i] != null; i++) {
IASTNode parent = declarations[i].getParent();
while( parent.getPropertyInParent() == IASTDeclarator.NESTED_DECLARATOR )
while (parent.getPropertyInParent() == IASTDeclarator.NESTED_DECLARATOR)
parent = parent.getParent();
IASTInitializer init = ((IASTDeclarator)parent).getInitializer();
if( init != null )
if (init != null)
return init;
}
return null;
@ -288,4 +288,10 @@ public class CPPParameter extends PlatformObject implements ICPPParameter, ICPPI
public boolean isExternC() {
return false;
}
@Override
public String toString() {
String name = getName();
return name.length() != 0 ? name : "<unnamed>"; //$NON-NLS-1$
}
}