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:
parent
934ea2e952
commit
7cdbcfc0f9
3 changed files with 263 additions and 185 deletions
|
@ -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);
|
||||
|
|
|
@ -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$
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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$
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue