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; 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.DOMException;
import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IField; 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.ICPPField;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; 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.ICPPScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.core.parser.util.ObjectMap; 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; 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 @Override
public boolean equals(Object obj) { public boolean equals(Object obj) {
return obj instanceof ICPPClassType && isSameType((ICPPClassType) obj); return obj instanceof ICPPClassType && isSameType((ICPPClassType) obj);

View file

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