diff options
Diffstat (limited to 'core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunction.java')
-rw-r--r-- | core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunction.java | 285 |
1 files changed, 148 insertions, 137 deletions
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunction.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunction.java index 0b1a4dde4e8..ae013888c56 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunction.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunction.java @@ -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$ + } } |