diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstance.java index 41bad61f301..f36f2320c40 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstance.java @@ -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 bases = null; + try { + for (ICPPBase base : getBases()) { + IBinding baseClass = base.getBaseClass(); + if (baseClass instanceof ICPPSpecialization) { + if (bases == null) { + bases = new ArrayList(); + } + 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); 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$ + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPParameter.java index eeb864075e8..1af477f6d9f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPParameter.java @@ -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 : ""; //$NON-NLS-1$ + } }