[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
[cdt-patch] added CVisitor.getDeclarations(IBinding)
|
This patch adds:
- the implementation to IASTName[] CASTTranslationUnit.getDeclarations(IBinding)
- AST2Tests are updated to test CASTTranslationUnit.getDeclarations(IBinding)
- also contains the CVisitor.ClearBindingFromScopeAction
patch
Devin Steffler
IBM's Eclipse CDT
Ottawa (Palladium), Ontario, Canada
Index: parser/org/eclipse/cdt/core/dom/ast/IASTTranslationUnit.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTTranslationUnit.java,v
retrieving revision 1.8
diff -u -r1.8 IASTTranslationUnit.java
--- parser/org/eclipse/cdt/core/dom/ast/IASTTranslationUnit.java 4 Jan 2005 14:52:22 -0000 1.8
+++ parser/org/eclipse/cdt/core/dom/ast/IASTTranslationUnit.java 11 Jan 2005 14:22:24 -0000
@@ -44,7 +44,7 @@
* @param binding
* @return List of IASTName nodes for the binding's declaration
*/
- public IASTDeclaration[] getDeclarations(IBinding binding);
+ public IASTName[] getDeclarations(IBinding binding);
/**
* Returns the list of references in this translation unit to the given
Index: parser/org/eclipse/cdt/core/dom/ast/c/ICScope.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/c/ICScope.java,v
retrieving revision 1.1
diff -u -r1.1 ICScope.java
--- parser/org/eclipse/cdt/core/dom/ast/c/ICScope.java 25 Nov 2004 22:07:17 -0000 1.1
+++ parser/org/eclipse/cdt/core/dom/ast/c/ICScope.java 11 Jan 2005 14:22:24 -0000
@@ -25,5 +25,6 @@
public static final int NAMESPACE_TYPE_OTHER = 1;
void addBinding( IBinding binding );
+ void removeBinding( IBinding binding );
public IBinding getBinding( int namespaceType, char [] name );
}
Index: parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTTranslationUnit.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTTranslationUnit.java,v
retrieving revision 1.3
diff -u -r1.3 CASTTranslationUnit.java
--- parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTTranslationUnit.java 4 Jan 2005 14:52:22 -0000 1.3
+++ parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTTranslationUnit.java 11 Jan 2005 14:22:24 -0000
@@ -99,9 +99,8 @@
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IASTTranslationUnit#getDeclarations(org.eclipse.cdt.core.dom.ast.IBinding)
*/
- public IASTDeclaration[] getDeclarations(IBinding binding) {
- // TODO Auto-generated method stub
- return null;
+ public IASTName[] getDeclarations(IBinding binding) {
+ return CVisitor.getDeclarations(this, binding);
}
/* (non-Javadoc)
Index: parser/org/eclipse/cdt/internal/core/dom/parser/c/CCompositeTypeScope.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CCompositeTypeScope.java,v
retrieving revision 1.1
diff -u -r1.1 CCompositeTypeScope.java
--- parser/org/eclipse/cdt/internal/core/dom/parser/c/CCompositeTypeScope.java 10 Dec 2004 03:53:09 -0000 1.1
+++ parser/org/eclipse/cdt/internal/core/dom/parser/c/CCompositeTypeScope.java 11 Jan 2005 14:22:24 -0000
@@ -72,4 +72,13 @@
// TODO Auto-generated method stub
return null;
}
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.core.dom.ast.c.ICScope#removeBinding(org.eclipse.cdt.core.dom.ast.IBinding)
+ */
+ public void removeBinding(IBinding binding) {
+ if( bindings != CharArrayObjectMap.EMPTY_MAP ) {
+ bindings.remove( binding.getNameCharArray(), 0, binding.getNameCharArray().length);
+ }
+ }
}
Index: parser/org/eclipse/cdt/internal/core/dom/parser/c/CFunctionScope.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CFunctionScope.java,v
retrieving revision 1.1
diff -u -r1.1 CFunctionScope.java
--- parser/org/eclipse/cdt/internal/core/dom/parser/c/CFunctionScope.java 10 Dec 2004 03:53:09 -0000 1.1
+++ parser/org/eclipse/cdt/internal/core/dom/parser/c/CFunctionScope.java 11 Jan 2005 14:22:24 -0000
@@ -114,5 +114,12 @@
}
}
-
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.core.dom.ast.c.ICScope#removeBinding(org.eclipse.cdt.core.dom.ast.IBinding)
+ */
+ public void removeBinding(IBinding binding) {
+ if( bindings != CharArrayObjectMap.EMPTY_MAP ) {
+ bindings.remove( binding.getNameCharArray(), 0, binding.getNameCharArray().length);
+ }
+ }
}
Index: parser/org/eclipse/cdt/internal/core/dom/parser/c/CScope.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CScope.java,v
retrieving revision 1.1
diff -u -r1.1 CScope.java
--- parser/org/eclipse/cdt/internal/core/dom/parser/c/CScope.java 10 Dec 2004 03:53:09 -0000 1.1
+++ parser/org/eclipse/cdt/internal/core/dom/parser/c/CScope.java 11 Jan 2005 14:22:24 -0000
@@ -63,4 +63,16 @@
public IBinding getBinding( int namespaceType, char [] name ){
return (IBinding) bindings[namespaceType].get( name );
}
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.core.dom.ast.c.ICScope#removeBinding(org.eclipse.cdt.core.dom.ast.IBinding)
+ */
+ public void removeBinding(IBinding binding) {
+ int type = ( binding instanceof ICompositeType || binding instanceof IEnumeration ) ?
+ NAMESPACE_TYPE_TAG : NAMESPACE_TYPE_OTHER;
+
+ if( bindings[type] != CharArrayObjectMap.EMPTY_MAP ) {
+ bindings[type].remove( binding.getNameCharArray(), 0, binding.getNameCharArray().length);
+ }
+ }
}
Index: parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java,v
retrieving revision 1.7
diff -u -r1.7 CVisitor.java
--- parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java 10 Jan 2005 21:11:53 -0000 1.7
+++ parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java 11 Jan 2005 14:22:25 -0000
@@ -45,12 +45,14 @@
import org.eclipse.cdt.core.dom.ast.IASTInitializerList;
import org.eclipse.cdt.core.dom.ast.IASTLabelStatement;
import org.eclipse.cdt.core.dom.ast.IASTName;
+import org.eclipse.cdt.core.dom.ast.IASTNamedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTPointerOperator;
import org.eclipse.cdt.core.dom.ast.IASTProblem;
import org.eclipse.cdt.core.dom.ast.IASTProblemHolder;
import org.eclipse.cdt.core.dom.ast.IASTReturnStatement;
+import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTStatement;
import org.eclipse.cdt.core.dom.ast.IASTSwitchStatement;
@@ -75,6 +77,7 @@
import org.eclipse.cdt.core.dom.ast.c.ICASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.c.ICASTElaboratedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.c.ICASTEnumerationSpecifier;
+import org.eclipse.cdt.core.dom.ast.c.ICASTFieldDesignator;
import org.eclipse.cdt.core.dom.ast.c.ICASTPointer;
import org.eclipse.cdt.core.dom.ast.c.ICASTSimpleDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.c.ICASTTypeIdInitializerExpression;
@@ -126,6 +129,20 @@
return true;
}
}
+
+ public static class ClearBindingFromScopeAction extends CBaseVisitorAction {
+ {
+ processNames = true;
+ }
+ public boolean processName(IASTName name) {
+ if ( name.resolveBinding() != null ) {
+ ICScope scope = (ICScope)name.resolveBinding().getScope();
+ if ( scope != null )
+ scope.removeBinding(name.resolveBinding());
+ }
+ return true;
+ }
+ }
public static class CollectProblemsAction extends CBaseVisitorAction {
{
@@ -212,6 +229,146 @@
return true;
}
}
+
+ public static class CollectDeclarationsAction extends CBaseVisitorAction {
+ {
+ processDeclarators = true;
+ processDeclSpecifiers = true;
+ processEnumerators = true;
+ processStatements = true;
+ }
+
+ private static final int DEFAULT_CHILDREN_LIST_SIZE = 8;
+ private IASTName[] declsFound = null;
+ int numFound = 0;
+ IBinding binding = null;
+ boolean functionDeclared = false;
+ boolean compositeTypeDeclared = false;
+
+ private void addName(IASTName name) {
+ if( declsFound.length == numFound ) // if the found array is full, then double the array
+ {
+ IASTName [] old = declsFound;
+ declsFound = new IASTName[ old.length * 2 ];
+ for( int j = 0; j < old.length; ++j )
+ declsFound[j] = old[j];
+ }
+ declsFound[numFound++] = name;
+ }
+
+ private IASTName[] removeNullFromNames() {
+ if (declsFound[declsFound.length-1] != null) { // if the last element in the list is not null then return the list
+ return declsFound;
+ } else if (declsFound[0] == null) { // if the first element in the list is null, then return empty list
+ return new IASTName[0];
+ }
+
+ IASTName[] results = new IASTName[numFound];
+ for (int i=0; i<results.length; i++)
+ results[i] = declsFound[i];
+
+ return results;
+ }
+
+ public IASTName[] getDeclarationNames() {
+ return removeNullFromNames();
+ }
+
+ public CollectDeclarationsAction(IBinding binding) {
+ declsFound = new IASTName[DEFAULT_CHILDREN_LIST_SIZE];
+ this.binding = binding;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processDeclarator(org.eclipse.cdt.core.dom.ast.IASTDeclarator)
+ */
+ public boolean processDeclarator(IASTDeclarator declarator) {
+ if ( declarator == null ) return true;
+
+ IASTNode parent = declarator.getParent();
+ while (parent != null && !(parent instanceof IASTDeclaration))
+ parent = parent.getParent();
+
+ if ( parent instanceof IASTDeclaration ) {
+ if ( !functionDeclared && parent != null && parent instanceof IASTFunctionDefinition ) {
+ if ( declarator.getName() != null && declarator.getName().resolveBinding() == binding ) {
+ functionDeclared = true;
+ addName(declarator.getName());
+ }
+ } else if ( parent instanceof IASTSimpleDeclaration ) {
+ if ( (declarator.getName() != null && declarator.getName().resolveBinding() == binding) ) {
+ if ( declarator instanceof IASTFunctionDeclarator ) {
+ functionDeclared = true;
+ }
+
+ addName(declarator.getName());
+ }
+ } else if ( parent instanceof IASTParameterDeclaration ) {
+ if ( declarator.getName() != null && declarator.getName().resolveBinding() == binding ) {
+ addName(declarator.getName());
+ }
+ }
+ }
+
+ return true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processDeclSpecifier(org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier)
+ */
+ public boolean processDeclSpecifier(IASTDeclSpecifier declSpec) {
+ if ( declSpec instanceof IASTSimpleDeclSpecifier ||
+ declSpec instanceof ICASTTypedefNameSpecifier ) return true;
+
+ if ( !compositeTypeDeclared && declSpec != null && declSpec instanceof IASTCompositeTypeSpecifier ) {
+ if (((IASTCompositeTypeSpecifier)declSpec).getName().resolveBinding() == binding) {
+ compositeTypeDeclared = true;
+ addName(((IASTCompositeTypeSpecifier)declSpec).getName());
+ }
+ } else if (!compositeTypeDeclared && declSpec instanceof IASTElaboratedTypeSpecifier ) {
+ if (((IASTElaboratedTypeSpecifier)declSpec).getName().resolveBinding() == binding) {
+ compositeTypeDeclared = true;
+ addName(((IASTElaboratedTypeSpecifier)declSpec).getName());
+ }
+ } else if (!compositeTypeDeclared && declSpec instanceof IASTEnumerationSpecifier ) {
+ if (((IASTEnumerationSpecifier)declSpec).getName().resolveBinding() == binding) {
+ compositeTypeDeclared = true;
+ addName(((IASTEnumerationSpecifier)declSpec).getName());
+ }
+ } else if ( declSpec instanceof IASTNamedTypeSpecifier ) {
+ if (((IASTNamedTypeSpecifier)declSpec).getName().resolveBinding() == binding)
+ addName(((IASTNamedTypeSpecifier)declSpec).getName());
+ }
+
+ return true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processEnumerator(org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator)
+ */
+ public boolean processEnumerator(IASTEnumerator enumerator) {
+ if (enumerator.getName().resolveBinding() == binding) {
+ IASTNode parent = enumerator.getParent();
+ while (parent != null && !(parent instanceof IASTDeclaration))
+ parent = parent.getParent();
+
+ if (parent != null && parent instanceof IASTDeclaration) addName(enumerator.getName());
+ }
+
+ return true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processStatement(org.eclipse.cdt.core.dom.ast.IASTStatement)
+ */
+ public boolean processStatement(IASTStatement statement) {
+ if ( statement instanceof IASTLabelStatement )
+ if ( ((IASTLabelStatement)statement).getName().resolveBinding() == binding )
+ addName(((IASTLabelStatement)statement).getName());
+
+ return true;
+ }
+ }
//lookup bits
private static final int COMPLETE = 0;
@@ -244,6 +401,8 @@
binding = createBinding( (ICASTEnumerationSpecifier) parent );
} else if( parent instanceof IASTEnumerator ) {
binding = createBinding( (IASTEnumerator) parent );
+ } else if( parent instanceof ICASTFieldDesignator ) {
+ binding = resolveBinding( parent );
}
((CASTName)name).setBinding( binding );
}
@@ -348,6 +507,18 @@
binding = createBinding( (IASTSimpleDeclaration) parent, name );
} else if( parent instanceof IASTParameterDeclaration ){
binding = createBinding( (IASTParameterDeclaration ) parent );
+
+ // C99 6.2.1-4: within the list of parameter declarations in a function definition, the
+ // identifier has block scope, which terminates at the end of the associated block.
+ parent = parent.getParent();
+ if ( parent instanceof IASTFunctionDeclarator ) {
+ parent = parent.getParent();
+ if ( parent instanceof IASTFunctionDefinition && ((IASTFunctionDefinition)parent).getBody() instanceof IASTCompoundStatement ) {
+ ICScope scope = (ICScope) ((IASTCompoundStatement)((IASTFunctionDefinition)parent).getBody()).getScope();
+ if ( scope != null && binding != null )
+ scope.addBinding(binding);
+ }
+ }
} else if ( parent instanceof IASTFunctionDeclarator ) {
binding = createBinding(declarator);
}
@@ -467,15 +638,18 @@
} else if( node instanceof IASTParameterDeclaration ){
IASTParameterDeclaration param = (IASTParameterDeclaration) node;
IASTFunctionDeclarator fDtor = (IASTFunctionDeclarator) param.getParent();
- IFunction function = (IFunction) fDtor.getName().resolveBinding();
- if( function.getPhysicalNode() != fDtor ) {
- IASTParameterDeclaration [] ps = fDtor.getParameters();
- int index = -1;
- for( index = 0; index < ps.length; index++ )
- if( ps[index] == param ) break;
- List params = function.getParameters();
- if( index >= 0 && index < params.size() ){
- return (IBinding) params.get( index );
+
+ if ( fDtor.getName().resolveBinding() instanceof IFunction ) { // possible to have IASTParameterDeclaration whose parent is an IVariable
+ IFunction function = (IFunction) fDtor.getName().resolveBinding();
+ if( function.getPhysicalNode() != fDtor ) {
+ IASTParameterDeclaration [] ps = fDtor.getParameters();
+ int index = -1;
+ for( index = 0; index < ps.length; index++ )
+ if( ps[index] == param ) break;
+ List params = function.getParameters();
+ if( index >= 0 && index < params.size() ){
+ return (IBinding) params.get( index );
+ }
}
}
} else if( node instanceof IASTTypeId ){
@@ -490,6 +664,36 @@
if( name != null ){
return name.resolveBinding();
}
+ } else if( node instanceof ICASTFieldDesignator ) {
+ IASTNode blockItem = getContainingBlockItem( node );
+
+ IASTNode parent = node.getParent();
+ while ( parent != null && !(parent.getParent() instanceof IASTTranslationUnit) )
+ parent = parent.getParent();
+
+ if ( parent.getParent() instanceof IASTTranslationUnit &&
+ blockItem instanceof IASTDeclarationStatement &&
+ ((IASTDeclarationStatement)blockItem).getDeclaration() instanceof IASTSimpleDeclaration &&
+ ((IASTSimpleDeclaration)((IASTDeclarationStatement)blockItem).getDeclaration()).getDeclSpecifier() instanceof IASTNamedTypeSpecifier ) {
+ // TODO use getDefinitions below instead of getDeclarations (i.e. want collection of defined members and the declaration doesn't always have it)
+ IASTName declNames[] = ((IASTTranslationUnit)parent.getParent()).getDeclarations(((IASTNamedTypeSpecifier)((IASTSimpleDeclaration)((IASTDeclarationStatement)blockItem).getDeclaration()).getDeclSpecifier()).getName().resolveBinding());
+ for (int i=0; i<declNames.length; i++) {
+ IASTNode declBlockItem = getContainingBlockItem(declNames[i]);
+ if ( declBlockItem instanceof IASTSimpleDeclaration ) {
+ if (((IASTSimpleDeclaration)declBlockItem).getDeclSpecifier() instanceof IASTCompositeTypeSpecifier ) {
+ IASTDeclaration[] decls = ((IASTCompositeTypeSpecifier)((IASTSimpleDeclaration)declBlockItem).getDeclSpecifier()).getMembers();
+ for (int j=0; j<decls.length; j++) {
+ if (decls[j] instanceof IASTSimpleDeclaration) {
+ IASTDeclarator[] decltors = ((IASTSimpleDeclaration)decls[j]).getDeclarators();
+ for(int k=0; k<decltors.length; k++)
+ if (CharArrayUtils.equals(decltors[k].getName().toCharArray(), ((ICASTFieldDesignator)node).getName().toCharArray()))
+ return decltors[k].getName().resolveBinding();
+ }
+ }
+ }
+ }
+ }
+ }
}
return null;
}
@@ -565,10 +769,11 @@
public static IScope getContainingScope(IASTParameterDeclaration parameterDeclaration) {
IASTNode parent = parameterDeclaration.getParent();
if( parent instanceof IASTFunctionDeclarator ){
- IASTFunctionDeclarator functionDeclarator = (IASTFunctionDeclarator) parent;
- IASTName fnName = functionDeclarator.getName();
- IFunction function = (IFunction) fnName.resolveBinding();
- return function.getFunctionScope();
+ parent = ((IASTDeclarator)parent).getParent();
+ if ( parent instanceof IASTFunctionDefinition &&
+ ((IASTFunctionDefinition)parent).getBody() instanceof IASTCompoundStatement ) {
+ return ((IASTCompoundStatement)((IASTFunctionDefinition)parent).getBody()).getScope();
+ }
}
return null;
@@ -806,6 +1011,7 @@
}
public static void clearBindings( IASTTranslationUnit tu ){
+ visitTranslationUnit( tu, new ClearBindingFromScopeAction() );
visitTranslationUnit( tu, new ClearBindingAction() );
}
@@ -1323,5 +1529,12 @@
visitTranslationUnit(tu, action);
return action.getProblems();
+ }
+
+ public static IASTName[] getDeclarations(IASTTranslationUnit tu, IBinding binding) {
+ CollectDeclarationsAction action = new CollectDeclarationsAction(binding);
+ visitTranslationUnit(tu, action);
+
+ return action.getDeclarationNames();
}
}
Index: parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTranslationUnit.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTranslationUnit.java,v
retrieving revision 1.5
diff -u -r1.5 CPPASTTranslationUnit.java
--- parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTranslationUnit.java 4 Jan 2005 14:52:22 -0000 1.5
+++ parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTranslationUnit.java 11 Jan 2005 14:22:25 -0000
@@ -116,7 +116,7 @@
*
* @see org.eclipse.cdt.core.dom.ast.IASTTranslationUnit#getDeclarations(org.eclipse.cdt.core.dom.ast.IBinding)
*/
- public IASTDeclaration[] getDeclarations(IBinding b) {
+ public IASTName[] getDeclarations(IBinding b) {
// TODO Auto-generated method stub
return null;
}
Index: parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java,v
retrieving revision 1.26
diff -u -r1.26 AST2Tests.java
--- parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java 21 Dec 2004 20:45:55 -0000 1.26
+++ parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java 11 Jan 2005 14:22:45 -0000
@@ -37,6 +37,7 @@
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNamedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration;
+import org.eclipse.cdt.core.dom.ast.IASTReturnStatement;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTStatement;
@@ -68,6 +69,7 @@
import org.eclipse.cdt.core.dom.ast.c.ICASTPointer;
import org.eclipse.cdt.core.dom.ast.c.ICArrayType;
import org.eclipse.cdt.core.dom.ast.c.ICFunctionScope;
+import org.eclipse.cdt.core.dom.ast.c.ICScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTPointerToMember;
import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.internal.core.dom.parser.c.CFunction;
@@ -153,7 +155,7 @@
IFunction func_f = (IFunction) name_f.resolveBinding();
assertEquals(globalScope, func_f.getScope());
IParameter var_y = (IParameter) name_y.resolveBinding();
- assertEquals(func_f.getFunctionScope(), var_y.getScope());
+ assertEquals(((IASTCompoundStatement)funcdef_f.getBody()).getScope(), var_y.getScope());
IVariable var_z = (IVariable) name_z.resolveBinding();
assertEquals(((ICFunctionScope)func_f.getFunctionScope()).getBodyScope(), var_z.getScope());
@@ -162,6 +164,41 @@
assertEquals(var_x, name_ref_x.resolveBinding());
assertEquals(var_y, name_ref_y.resolveBinding());
+ // test tu.getDeclarations(IBinding)
+ IASTName[] decls = tu.getDeclarations(name_x.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_x );
+
+ decls = tu.getDeclarations(name_f.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_f );
+
+ decls = tu.getDeclarations(name_y.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_y );
+
+ decls = tu.getDeclarations(name_z.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_z );
+
+ decls = tu.getDeclarations(name_ref_x.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_x );
+
+ decls = tu.getDeclarations(name_ref_y.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_y );
+
+ // test clearBindings
+ assertNotNull( ((ICScope)tu.getScope()).getBinding(ICScope.NAMESPACE_TYPE_OTHER, new String("x").toCharArray()) ); //$NON-NLS-1$
+ assertNotNull( ((ICScope)tu.getScope()).getBinding(ICScope.NAMESPACE_TYPE_OTHER, new String("f").toCharArray()) ); //$NON-NLS-1$
+ assertNotNull( ((ICScope)body_f.getScope()).getBinding(ICScope.NAMESPACE_TYPE_OTHER, new String("z").toCharArray()) ); //$NON-NLS-1$
+ assertNotNull( ((ICScope)body_f.getScope()).getBinding(ICScope.NAMESPACE_TYPE_OTHER, new String("y").toCharArray()) ); //$NON-NLS-1$
+ CVisitor.clearBindings(tu);
+ assertNull( ((ICScope)tu.getScope()).getBinding(ICScope.NAMESPACE_TYPE_OTHER, new String("x").toCharArray()) ); //$NON-NLS-1$
+ assertNull( ((ICScope)tu.getScope()).getBinding(ICScope.NAMESPACE_TYPE_OTHER, new String("f").toCharArray()) ); //$NON-NLS-1$
+ assertNull( ((ICScope)body_f.getScope()).getBinding(ICScope.NAMESPACE_TYPE_OTHER, new String("z").toCharArray()) ); //$NON-NLS-1$
+ assertNull( ((ICScope)body_f.getScope()).getBinding(ICScope.NAMESPACE_TYPE_OTHER, new String("y").toCharArray()) ); //$NON-NLS-1$
}
public void testSimpleStruct() throws ParserException {
@@ -243,6 +280,35 @@
assertEquals(var_myS, ref_myS.getName().resolveBinding());
IField field_x = (IField)name_x.resolveBinding();
assertEquals(field_x, fieldref.getFieldName().resolveBinding());
+
+ // test tu.getDeclarations(IBinding)
+ IASTName[] decls = tu.getDeclarations(name_struct.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_struct );
+
+ decls = tu.getDeclarations(name_x.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_x );
+
+ decls = tu.getDeclarations(def_f.getDeclarator().getName().resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], def_f.getDeclarator().getName() );
+
+ decls = tu.getDeclarations(name_S.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_S );
+
+ decls = tu.getDeclarations(name_myS.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_myS );
+
+ decls = tu.getDeclarations(ref_myS.getName().resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_myS );
+
+ decls = tu.getDeclarations(fieldref.getFieldName().resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_x );
}
public void testCExpressions() throws ParserException
@@ -306,6 +372,15 @@
assertEquals( name1.resolveBinding().getName(), "r" ); //$NON-NLS-1$
assertEquals( name2.resolveBinding().getName(), "s" ); //$NON-NLS-1$
+
+ // test tu.getDeclarations(IBinding)
+ IASTName[] decls = tu.getDeclarations(name1.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name1 );
+
+ decls = tu.getDeclarations(name2.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name2 );
}
public void testStructureTagScoping_1() throws Exception{
@@ -359,6 +434,27 @@
assertNotSame( str1, str2 );
assertSame( str2, str3 );
assertSame( str3, str4 );
+
+ // test tu.getDeclarations(IBinding)
+ IASTName[] decls = tu.getDeclarations(nameA1.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], nameA1 );
+
+ decls = tu.getDeclarations(fndef.getDeclarator().getName().resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], fndef.getDeclarator().getName() );
+
+ decls = tu.getDeclarations(nameA2.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], nameA2 );
+
+ decls = tu.getDeclarations(nameA3.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], nameA2 );
+
+ decls = tu.getDeclarations(namea.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], namea );
}
public void testStructureTagScoping_2() throws Exception{
@@ -400,6 +496,23 @@
assertNotNull( str1 );
assertSame( str1, str2 );
assertSame( str2, str3 );
+
+ // test tu.getDeclarations(IBinding)
+ IASTName[] decls = tu.getDeclarations(nameA1.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], nameA1 );
+
+ decls = tu.getDeclarations(fndef.getDeclarator().getName().resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], fndef.getDeclarator().getName() );
+
+ decls = tu.getDeclarations(nameA2.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], nameA1 );
+
+ decls = tu.getDeclarations(namea.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], namea );
}
public void testStructureDef() throws Exception{
@@ -414,28 +527,28 @@
IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.C );
//struct A;
- IASTSimpleDeclaration decl = (IASTSimpleDeclaration) tu.getDeclarations()[0];
- IASTElaboratedTypeSpecifier elabTypeSpec = (IASTElaboratedTypeSpecifier) decl.getDeclSpecifier();
- assertEquals( 0, decl.getDeclarators().length );
+ IASTSimpleDeclaration decl1 = (IASTSimpleDeclaration) tu.getDeclarations()[0];
+ IASTElaboratedTypeSpecifier elabTypeSpec = (IASTElaboratedTypeSpecifier) decl1.getDeclSpecifier();
+ assertEquals( 0, decl1.getDeclarators().length );
IASTName name_A1 = elabTypeSpec.getName();
//struct A * a;
- decl = (IASTSimpleDeclaration) tu.getDeclarations()[1];
- elabTypeSpec = (IASTElaboratedTypeSpecifier) decl.getDeclSpecifier();
+ IASTSimpleDeclaration decl2 = (IASTSimpleDeclaration) tu.getDeclarations()[1];
+ elabTypeSpec = (IASTElaboratedTypeSpecifier) decl2.getDeclSpecifier();
IASTName name_A2 = elabTypeSpec.getName();
- IASTDeclarator dtor = decl.getDeclarators()[0];
+ IASTDeclarator dtor = decl2.getDeclarators()[0];
IASTName name_a = dtor.getName();
assertEquals( 1, dtor.getPointerOperators().length );
assertTrue( dtor.getPointerOperators()[0] instanceof ICASTPointer );
//struct A {
- decl = (IASTSimpleDeclaration) tu.getDeclarations()[2];
- ICASTCompositeTypeSpecifier compTypeSpec = (ICASTCompositeTypeSpecifier) decl.getDeclSpecifier();
+ IASTSimpleDeclaration decl3 = (IASTSimpleDeclaration) tu.getDeclarations()[2];
+ ICASTCompositeTypeSpecifier compTypeSpec = (ICASTCompositeTypeSpecifier) decl3.getDeclSpecifier();
IASTName name_Adef = compTypeSpec.getName();
// int i;
- decl = (IASTSimpleDeclaration) compTypeSpec.getMembers()[0];
- dtor = decl.getDeclarators()[0];
+ IASTSimpleDeclaration decl4 = (IASTSimpleDeclaration) compTypeSpec.getMembers()[0];
+ dtor = decl4.getDeclarators()[0];
IASTName name_i = dtor.getName();
//void f() {
@@ -467,6 +580,39 @@
assertSame( structA_1, structA_2 );
assertSame( structA_2, structA_3 );
assertSame( structA_3, structA_4 );
+
+ // test tu.getDeclarations(IBinding)
+ IASTName[] decls = tu.getDeclarations(name_A1.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_A1 );
+
+ decls = tu.getDeclarations(name_A2.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_A1 );
+
+ decls = tu.getDeclarations(name_a.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_a );
+
+ decls = tu.getDeclarations(name_Adef.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_A1 );
+
+ decls = tu.getDeclarations(name_i.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_i );
+
+ decls = tu.getDeclarations(fndef.getDeclarator().getName().resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], fndef.getDeclarator().getName() );
+
+ decls = tu.getDeclarations(name_aref.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_a );
+
+ decls = tu.getDeclarations(name_iref.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_i );
}
public void testStructureNamespace() throws Exception {
@@ -478,8 +624,8 @@
IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.C );
- IASTSimpleDeclaration declaration = (IASTSimpleDeclaration) tu.getDeclarations()[0];
- IASTCompositeTypeSpecifier typeSpec = (IASTCompositeTypeSpecifier) declaration.getDeclSpecifier();
+ IASTSimpleDeclaration declaration1 = (IASTSimpleDeclaration) tu.getDeclarations()[0];
+ IASTCompositeTypeSpecifier typeSpec = (IASTCompositeTypeSpecifier) declaration1.getDeclSpecifier();
IASTName x_1 = typeSpec.getName();
IASTFunctionDefinition fdef = (IASTFunctionDefinition) tu.getDeclarations()[1];
@@ -488,8 +634,8 @@
IASTCompoundStatement compound = (IASTCompoundStatement) fdef.getBody();
IASTDeclarationStatement declStatement = (IASTDeclarationStatement) compound.getStatements()[0];
- declaration = (IASTSimpleDeclaration) declStatement.getDeclaration();
- IASTElaboratedTypeSpecifier elab = (IASTElaboratedTypeSpecifier) declaration.getDeclSpecifier();
+ IASTSimpleDeclaration declaration2 = (IASTSimpleDeclaration) declStatement.getDeclaration();
+ IASTElaboratedTypeSpecifier elab = (IASTElaboratedTypeSpecifier) declaration2.getDeclSpecifier();
IASTName x_3 = elab.getName();
ICompositeType x1 = (ICompositeType) x_1.resolveBinding();
@@ -500,7 +646,40 @@
assertNotNull( x2 );
assertSame( x1, x3 );
assertNotSame( x2, x3 );
-
+
+ IASTDeclarator decl_i = declaration2.getDeclarators()[0];
+ decl_i.getName().resolveBinding(); // add i's binding to the scope
+
+ // test tu.getDeclarations(IBinding)
+ IASTName[] decls = tu.getDeclarations(x_1.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], x_1 );
+
+ decls = tu.getDeclarations(fdef.getDeclarator().getName().resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], fdef.getDeclarator().getName() );
+
+ decls = tu.getDeclarations(x_2.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], x_2 );
+
+ decls = tu.getDeclarations(x_3.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], x_1 );
+
+ decls = tu.getDeclarations(declaration2.getDeclarators()[0].getName().resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], declaration2.getDeclarators()[0].getName() );
+
+ assertNotNull( ((ICScope)tu.getScope()).getBinding(ICScope.NAMESPACE_TYPE_TAG, new String("x").toCharArray()) ); //$NON-NLS-1$
+ assertNotNull( ((ICScope)tu.getScope()).getBinding(ICScope.NAMESPACE_TYPE_OTHER, new String("f").toCharArray()) ); //$NON-NLS-1$
+ assertNotNull( ((ICScope)compound.getScope()).getBinding(ICScope.NAMESPACE_TYPE_OTHER, new String("x").toCharArray()) ); //$NON-NLS-1$
+ assertNotNull( ((ICScope)compound.getScope()).getBinding(ICScope.NAMESPACE_TYPE_OTHER, new String("i").toCharArray()) ); //$NON-NLS-1$
+ CVisitor.clearBindings(tu);
+ assertNull( ((ICScope)tu.getScope()).getBinding(ICScope.NAMESPACE_TYPE_TAG, new String("x").toCharArray()) ); //$NON-NLS-1$
+ assertNull( ((ICScope)tu.getScope()).getBinding(ICScope.NAMESPACE_TYPE_OTHER, new String("f").toCharArray()) ); //$NON-NLS-1$
+ assertNull( ((ICScope)compound.getScope()).getBinding(ICScope.NAMESPACE_TYPE_OTHER, new String("x").toCharArray()) ); //$NON-NLS-1$
+ assertNull( ((ICScope)compound.getScope()).getBinding(ICScope.NAMESPACE_TYPE_OTHER, new String("i").toCharArray()) ); //$NON-NLS-1$
}
public void testFunctionParameters() throws Exception {
StringBuffer buffer = new StringBuffer();
@@ -516,8 +695,8 @@
IASTFunctionDeclarator dtor = (IASTFunctionDeclarator) f_decl.getDeclarators()[0];
IASTName f_name1 = dtor.getName();
// int a );
- IASTParameterDeclaration param = dtor.getParameters()[0];
- IASTDeclarator paramDtor = param.getDeclarator();
+ IASTParameterDeclaration param1 = dtor.getParameters()[0];
+ IASTDeclarator paramDtor = param1.getDeclarator();
IASTName name_param1 = paramDtor.getName();
//void f(
@@ -525,8 +704,8 @@
dtor = f_defn.getDeclarator();
IASTName f_name2 = dtor.getName();
// int b );
- param = dtor.getParameters()[0];
- paramDtor = param.getDeclarator();
+ IASTParameterDeclaration param2 = dtor.getParameters()[0];
+ paramDtor = param2.getDeclarator();
IASTName name_param2 = paramDtor.getName();
// b;
@@ -559,6 +738,25 @@
assertSame( param_1, param_2 );
assertSame( param_2, param_3 );
assertSame( f_1, f_2 );
+
+ // test tu.getDeclarations(IBinding)
+ IASTName[] decls = tu.getDeclarations(f_name1.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], f_name1 );
+
+ decls = tu.getDeclarations(name_param1.resolveBinding());
+ assertEquals( decls.length, 2 );
+ assertEquals( decls[0], name_param1 );
+ assertEquals( decls[1], name_param2 );
+
+ decls = tu.getDeclarations(f_name2.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], f_name1 );
+
+ decls = tu.getDeclarations(name_param2.resolveBinding());
+ assertEquals( decls.length, 2 );
+ assertEquals( decls[0], name_param1 );
+ assertEquals( decls[1], name_param2 );
}
public void testSimpleFunction() throws Exception {
@@ -587,6 +785,19 @@
assertEquals( 2, params.size() );
assertSame( params.get(0), param_a );
assertSame( params.get(1), param_b );
+
+ // test tu.getDeclarations(IBinding)
+ IASTName[] decls = tu.getDeclarations(fName.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], fName );
+
+ decls = tu.getDeclarations(name_a.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_a );
+
+ decls = tu.getDeclarations(name_b.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_b );
}
public void testSimpleFunctionCall() throws Exception {
@@ -628,6 +839,23 @@
assertNotNull( function_1 );
assertSame( function_1, function_2 );
assertSame( function_2, function_3 );
+
+ // test tu.getDeclarations(IBinding)
+ IASTName[] decls = tu.getDeclarations(name_f.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_f );
+
+ decls = tu.getDeclarations(gdef.getDeclarator().getName().resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], gdef.getDeclarator().getName() );
+
+ decls = tu.getDeclarations(name_fcall.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_f );
+
+ decls = tu.getDeclarations(name_fdef.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_f );
}
public void testForLoop() throws Exception {
@@ -678,6 +906,27 @@
assertSame( var_1, var_2 );
assertSame( var_2, var_3 );
assertSame( var_3, var_4 );
+
+ // test tu.getDeclarations(IBinding)
+ IASTName[] decls = tu.getDeclarations(fdef.getDeclarator().getName().resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], fdef.getDeclarator().getName() );
+
+ decls = tu.getDeclarations(name_i.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_i );
+
+ decls = tu.getDeclarations(name_i2.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_i );
+
+ decls = tu.getDeclarations(name_i3.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_i );
+
+ decls = tu.getDeclarations(name_i4.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_i );
}
public void testExpressionFieldReference() throws Exception{
@@ -704,6 +953,27 @@
assertNotNull( x1 );
assertSame( x1, x2 );
+
+ // test tu.getDeclarations(IBinding)
+ IASTName[] decls = tu.getDeclarations(compType.getName().resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], compType.getName() );
+
+ decls = tu.getDeclarations(name_x1.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_x1 );
+
+ decls = tu.getDeclarations(fdef.getDeclarator().getName().resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], fdef.getDeclarator().getName() );
+
+ decls = tu.getDeclarations( ((IASTElaboratedTypeSpecifier)((IASTCastExpression)((IASTFieldReference)expStatement.getExpression()).getFieldOwner()).getTypeId().getDeclSpecifier()).getName().resolveBinding() );
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], compType.getName() );
+
+ decls = tu.getDeclarations(name_x2.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_x1 );
}
public void testLabels() throws Exception {
@@ -728,18 +998,63 @@
assertNotNull( function );
assertNotNull( label_1 );
assertEquals( label_1, label_2 );
+
+ // test tu.getDeclarations(IBinding)
+ IASTName[] decls = tu.getDeclarations(collector.getName( 0 ).resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], collector.getName( 0 ) );
+
+ decls = tu.getDeclarations(collector.getName( 1 ).resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], collector.getName( 2 ) );
+
+ decls = tu.getDeclarations(collector.getName( 2 ).resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], collector.getName( 2 ) );
}
public void testAnonStruct() throws Exception
{
StringBuffer buffer = new StringBuffer( "typedef struct { } X;\n"); //$NON-NLS-1$
buffer.append( "int f( X x );"); //$NON-NLS-1$
- parse( buffer.toString(), ParserLanguage.C );
+ IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.C );
+
+ // test tu.getDeclarations(IBinding)
+ IASTSimpleDeclaration decl1 = (IASTSimpleDeclaration)tu.getDeclarations()[0];
+ IASTSimpleDeclaration decl2 = (IASTSimpleDeclaration)tu.getDeclarations()[1];
+ IASTName name_X1 = decl1.getDeclarators()[0].getName();
+ IASTName name_f = decl2.getDeclarators()[0].getName();
+ IASTName name_X2 = ((IASTNamedTypeSpecifier)((IASTFunctionDeclarator)decl2.getDeclarators()[0]).getParameters()[0].getDeclSpecifier()).getName();
+ IASTName name_x = ((IASTFunctionDeclarator)decl2.getDeclarators()[0]).getParameters()[0].getDeclarator().getName();
+
+ IASTName[] decls = tu.getDeclarations(name_X1.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_X1 );
+
+ decls = tu.getDeclarations(name_f.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_f );
+
+ decls = tu.getDeclarations(name_X2.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_X1 );
+
+ decls = tu.getDeclarations(name_x.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_x );
}
public void testLongLong() throws ParserException
{
- parse( "long long x;\n", ParserLanguage.C ); //$NON-NLS-1$
+ IASTTranslationUnit tu = parse( "long long x;\n", ParserLanguage.C ); //$NON-NLS-1$
+
+ // test tu.getDeclarations(IBinding)
+ IASTSimpleDeclaration decl1 = (IASTSimpleDeclaration)tu.getDeclarations()[0];
+ IASTName name_x = decl1.getDeclarators()[0].getName();
+
+ IASTName[] decls = tu.getDeclarations(name_x.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_x );
}
public void testEnumerations() throws Exception {
@@ -755,35 +1070,35 @@
IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.C );
- IASTSimpleDeclaration decl = (IASTSimpleDeclaration) tu.getDeclarations()[0];
- assertEquals( decl.getDeclarators().length, 0 );
- ICASTEnumerationSpecifier enumSpec = (ICASTEnumerationSpecifier) decl.getDeclSpecifier();
+ IASTSimpleDeclaration decl1 = (IASTSimpleDeclaration) tu.getDeclarations()[0];
+ assertEquals( decl1.getDeclarators().length, 0 );
+ ICASTEnumerationSpecifier enumSpec = (ICASTEnumerationSpecifier) decl1.getDeclSpecifier();
IASTEnumerator e1 = enumSpec.getEnumerators()[0];
IASTEnumerator e2 = enumSpec.getEnumerators()[1];
IASTEnumerator e3 = enumSpec.getEnumerators()[2];
IASTName name_hue = enumSpec.getName();
- decl = (IASTSimpleDeclaration) tu.getDeclarations()[1];
- IASTDeclarator dtor = decl.getDeclarators()[0];
+ IASTSimpleDeclaration decl2 = (IASTSimpleDeclaration) tu.getDeclarations()[1];
+ IASTDeclarator dtor = decl2.getDeclarators()[0];
IASTName name_col = dtor.getName();
- dtor = decl.getDeclarators()[1];
+ dtor = decl2.getDeclarators()[1];
IASTName name_cp = dtor.getName();
- IASTElaboratedTypeSpecifier spec = (IASTElaboratedTypeSpecifier) decl.getDeclSpecifier();
+ IASTElaboratedTypeSpecifier spec = (IASTElaboratedTypeSpecifier) decl2.getDeclSpecifier();
assertEquals( spec.getKind(), IASTElaboratedTypeSpecifier.k_enum );
IASTName name_hue2 = spec.getName();
IASTFunctionDefinition fn = (IASTFunctionDefinition) tu.getDeclarations()[2];
IASTCompoundStatement compound = (IASTCompoundStatement) fn.getBody();
- IASTExpressionStatement expStatement = (IASTExpressionStatement) compound.getStatements()[0];
- IASTBinaryExpression exp = (IASTBinaryExpression) expStatement.getExpression();
+ IASTExpressionStatement expStatement1 = (IASTExpressionStatement) compound.getStatements()[0];
+ IASTBinaryExpression exp = (IASTBinaryExpression) expStatement1.getExpression();
assertEquals( exp.getOperator(), IASTBinaryExpression.op_assign );
IASTIdExpression id1 = (IASTIdExpression) exp.getOperand1();
IASTIdExpression id2 = (IASTIdExpression) exp.getOperand2();
IASTName r_col = id1.getName();
IASTName r_blue = id2.getName();
- expStatement = (IASTExpressionStatement) compound.getStatements()[1];
- exp = (IASTBinaryExpression) expStatement.getExpression();
+ IASTExpressionStatement expStatement2 = (IASTExpressionStatement) compound.getStatements()[1];
+ exp = (IASTBinaryExpression) expStatement2.getExpression();
assertEquals( exp.getOperator(), IASTBinaryExpression.op_assign );
id1 = (IASTIdExpression) exp.getOperand1();
IASTUnaryExpression ue = (IASTUnaryExpression) exp.getOperand2();
@@ -827,6 +1142,63 @@
assertSame( col, col3 );
assertSame( cp, cp3 );
assertSame( red, red2 );
+
+ // test tu.getDeclarations(IBinding)
+ IASTName[] decls = tu.getDeclarations(name_hue.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_hue );
+
+ decls = tu.getDeclarations(e1.getName().resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], e1.getName() );
+
+ decls = tu.getDeclarations(e2.getName().resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], e2.getName() );
+
+ decls = tu.getDeclarations(e3.getName().resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], e3.getName() );
+
+ decls = tu.getDeclarations(name_hue2.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_hue );
+
+ decls = tu.getDeclarations(name_col.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_col );
+
+ decls = tu.getDeclarations(name_cp.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_cp );
+
+ decls = tu.getDeclarations(fn.getDeclarator().getName().resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], fn.getDeclarator().getName() );
+
+ decls = tu.getDeclarations(r_col.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_col );
+
+ decls = tu.getDeclarations(r_blue.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], e2.getName() );
+
+ decls = tu.getDeclarations(r_cp.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_cp );
+
+ decls = tu.getDeclarations(r_col2.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_col );
+
+ decls = tu.getDeclarations(r_cp2.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_cp );
+
+ decls = tu.getDeclarations(r_red.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], e1.getName() );
}
public void testPointerToFunction() throws Exception
@@ -841,6 +1213,12 @@
assertEquals( f.getNestedDeclarator().getName().toString(), "pfi"); //$NON-NLS-1$
assertTrue( f.getPointerOperators().length == 0 );
assertFalse( f.getNestedDeclarator().getPointerOperators().length == 0 );
+
+ // test tu.getDeclarations(IBinding)
+ IASTName[] decls = tu.getDeclarations(f.getNestedDeclarator().getName().resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], f.getNestedDeclarator().getName() );
+
tu = parse( "int (*pfi)();", ParserLanguage.CPP ); //$NON-NLS-1$
assertEquals( tu.getDeclarations().length, 1 );
d = (IASTSimpleDeclaration) tu.getDeclarations()[0];
@@ -998,13 +1376,20 @@
IASTSimpleDeclaration decl = (IASTSimpleDeclaration) tu.getDeclarations()[0];
IASTCompositeTypeSpecifier compSpec = (IASTCompositeTypeSpecifier) decl.getDeclSpecifier();
ICompositeType A = (ICompositeType) compSpec.getName().resolveBinding();
+ IASTName name_a1 = decl.getDeclarators()[0].getName();
IVariable a1 = (IVariable) decl.getDeclarators()[0].getName().resolveBinding();
decl = (IASTSimpleDeclaration) tu.getDeclarations()[1];
+ IASTName name_A2 = ((IASTElaboratedTypeSpecifier)decl.getDeclSpecifier()).getName();
+ IASTName name_AP = decl.getDeclarators()[0].getName();
ITypedef AP = (ITypedef) decl.getDeclarators()[0].getName().resolveBinding();
decl = (IASTSimpleDeclaration) tu.getDeclarations()[2];
+ IASTName name_A3 = ((IASTElaboratedTypeSpecifier)decl.getDeclSpecifier()).getName();
IVariable a2 = (IVariable) decl.getDeclarators()[0].getName().resolveBinding();
+ IASTName name_a2 = decl.getDeclarators()[0].getName();
decl = (IASTSimpleDeclaration) tu.getDeclarations()[3];
IVariable a3 = (IVariable) decl.getDeclarators()[0].getName().resolveBinding();
+ IASTName name_a3 = decl.getDeclarators()[0].getName();
+ IASTName name_AP2 = ((IASTNamedTypeSpecifier)decl.getDeclSpecifier()).getName();
IType t_a1 = a1.getType();
assertSame( t_a1, A );
@@ -1019,6 +1404,39 @@
IType t_AP = AP.getType();
assertTrue( t_AP instanceof IPointerType );
assertSame( ((IPointerType) t_AP).getType(), A );
+
+ // test tu.getDeclarations(IBinding)
+ IASTName[] decls = tu.getDeclarations(compSpec.getName().resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], compSpec.getName() );
+
+ decls = tu.getDeclarations(name_a1.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_a1 );
+
+ decls = tu.getDeclarations(name_A2.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], compSpec.getName() );
+
+ decls = tu.getDeclarations(name_AP.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_AP );
+
+ decls = tu.getDeclarations(name_A3.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], compSpec.getName() );
+
+ decls = tu.getDeclarations(name_a2.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_a2 );
+
+ decls = tu.getDeclarations(name_AP2.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_AP );
+
+ decls = tu.getDeclarations(name_a3.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_a3 );
}
public void testArrayTypes() throws Exception {
@@ -1030,10 +1448,13 @@
IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.C );
IASTSimpleDeclaration decl = (IASTSimpleDeclaration) tu.getDeclarations()[0];
+ IASTName name_a = decl.getDeclarators()[0].getName();
IVariable a = (IVariable) decl.getDeclarators()[0].getName().resolveBinding();
decl = (IASTSimpleDeclaration) tu.getDeclarations()[1];
+ IASTName name_b = decl.getDeclarators()[0].getName();
IVariable b = (IVariable) decl.getDeclarators()[0].getName().resolveBinding();
decl = (IASTSimpleDeclaration) tu.getDeclarations()[2];
+ IASTName name_c = decl.getDeclarators()[0].getName();
IVariable c = (IVariable) decl.getDeclarators()[0].getName().resolveBinding();
IType t_a_1 = a.getType();
@@ -1068,6 +1489,19 @@
IType t_c_6 = ((IQualifierType)t_c_5).getType();
assertTrue( t_c_6 instanceof IBasicType );
assertEquals( ((IBasicType)t_c_6).getType(), IBasicType.t_char);
+
+ // test tu.getDeclarations(IBinding)
+ IASTName[] decls = tu.getDeclarations(name_a.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_a );
+
+ decls = tu.getDeclarations(name_b.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_b );
+
+ decls = tu.getDeclarations(name_c.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_c );
}
public void testFunctionTypes() throws Exception{
@@ -1075,22 +1509,31 @@
buffer.append( "struct A; \n"); //$NON-NLS-1$
buffer.append( "int * f( int i, char c ); \n"); //$NON-NLS-1$
buffer.append( "void ( *g ) ( struct A * ); \n"); //$NON-NLS-1$
- buffer.append( "void (* (*h)(struct A**) ) ( int ); \n"); //$NON-NLS-1$
+ buffer.append( "void (* (*h)(struct A**) ) ( int d ); \n"); //$NON-NLS-1$
IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.C );
IASTSimpleDeclaration decl = (IASTSimpleDeclaration) tu.getDeclarations()[0];
IASTElaboratedTypeSpecifier elabSpec = (IASTElaboratedTypeSpecifier) decl.getDeclSpecifier();
ICompositeType A = (ICompositeType) elabSpec.getName().resolveBinding();
+ IASTName name_A1 = elabSpec.getName();
decl = (IASTSimpleDeclaration) tu.getDeclarations()[1];
IFunction f = (IFunction) decl.getDeclarators()[0].getName().resolveBinding();
+ IASTName name_f = decl.getDeclarators()[0].getName();
+ IASTName name_i = ((IASTFunctionDeclarator)decl.getDeclarators()[0]).getParameters()[0].getDeclarator().getName();
+ IASTName name_c = ((IASTFunctionDeclarator)decl.getDeclarators()[0]).getParameters()[1].getDeclarator().getName();
decl = (IASTSimpleDeclaration) tu.getDeclarations()[2];
IVariable g = (IVariable) decl.getDeclarators()[0].getNestedDeclarator().getName().resolveBinding();
+ IASTName name_g = decl.getDeclarators()[0].getNestedDeclarator().getName();
+ IASTName name_A2 = ((IASTElaboratedTypeSpecifier)((IASTFunctionDeclarator)decl.getDeclarators()[0]).getParameters()[0].getDeclSpecifier()).getName();
decl = (IASTSimpleDeclaration) tu.getDeclarations()[3];
IVariable h = (IVariable) decl.getDeclarators()[0].getNestedDeclarator().getNestedDeclarator().getName().resolveBinding();
+ IASTName name_h = decl.getDeclarators()[0].getNestedDeclarator().getNestedDeclarator().getName();
+ IASTName name_A3 = ((IASTElaboratedTypeSpecifier)((IASTFunctionDeclarator)decl.getDeclarators()[0].getNestedDeclarator()).getParameters()[0].getDeclSpecifier()).getName();
+ IASTName name_d = ((IASTFunctionDeclarator)decl.getDeclarators()[0]).getParameters()[0].getDeclarator().getName();
IFunctionType t_f = f.getType();
IType t_f_return = t_f.getReturnType();
@@ -1136,6 +1579,43 @@
assertTrue( h_r instanceof IBasicType );
assertEquals( h_ps.length, 1 );
assertTrue( h_ps[0] instanceof IBasicType );
+
+ // test tu.getDeclarations(IBinding)
+ IASTName[] decls = tu.getDeclarations(name_A1.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_A1 );
+
+ decls = tu.getDeclarations(name_f.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_f );
+
+ decls = tu.getDeclarations(name_i.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_i );
+
+ decls = tu.getDeclarations(name_c.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_c );
+
+ decls = tu.getDeclarations(name_g.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_g );
+
+ decls = tu.getDeclarations(name_A2.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_A1 );
+
+ decls = tu.getDeclarations(name_h.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_h );
+
+ decls = tu.getDeclarations(name_A3.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_A1 );
+
+ decls = tu.getDeclarations(name_d.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_d );
}
public void testDesignatedInitializers() throws ParserException
@@ -1156,18 +1636,76 @@
IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.C );
assertNotNull( tu );
IASTDeclaration []declarations = tu.getDeclarations();
+ IASTName name_Coord = ((IASTSimpleDeclaration)declarations[0]).getDeclarators()[0].getName();
+ IASTName name_x = ((IASTSimpleDeclaration)((IASTCompositeTypeSpecifier)((IASTSimpleDeclaration)declarations[0]).getDeclSpecifier()).getMembers()[0]).getDeclarators()[0].getName();
+ IASTName name_y = ((IASTSimpleDeclaration)((IASTCompositeTypeSpecifier)((IASTSimpleDeclaration)declarations[0]).getDeclSpecifier()).getMembers()[1]).getDeclarators()[0].getName();
+ IASTName name_Point = ((IASTSimpleDeclaration)declarations[1]).getDeclarators()[0].getName();
+ IASTName name_pos = ((IASTSimpleDeclaration)((IASTCompositeTypeSpecifier)((IASTSimpleDeclaration)declarations[1]).getDeclSpecifier()).getMembers()[0]).getDeclarators()[0].getName();
+ IASTName name_width = ((IASTSimpleDeclaration)((IASTCompositeTypeSpecifier)((IASTSimpleDeclaration)declarations[1]).getDeclSpecifier()).getMembers()[1]).getDeclarators()[0].getName();
IASTFunctionDefinition main = (IASTFunctionDefinition) declarations[2];
IASTStatement [] statements = ((IASTCompoundStatement)main.getBody()).getStatements();
+
IASTSimpleDeclaration xy = (IASTSimpleDeclaration) ((IASTDeclarationStatement)statements[0]).getDeclaration();
+ IASTName name_Coord2 = ((IASTNamedTypeSpecifier)xy.getDeclSpecifier()).getName();
+ IASTName name_xy = xy.getDeclarators()[0].getName();
IASTDeclarator declarator_xy = xy.getDeclarators()[0];
- IASTInitializer [] initializers = ((IASTInitializerList) declarator_xy.getInitializer()).getInitializers();
+ IASTInitializer [] initializers1 = ((IASTInitializerList) declarator_xy.getInitializer()).getInitializers();
+ IASTName name_y2 = ((ICASTFieldDesignator)((ICASTDesignatedInitializer)initializers1[0]).getDesignators()[0]).getName();
+ IASTName name_x2 = ((ICASTFieldDesignator)((ICASTDesignatedInitializer)initializers1[1]).getDesignators()[0]).getName();
+
+ IASTSimpleDeclaration point = (IASTSimpleDeclaration) ((IASTDeclarationStatement)statements[1]).getDeclaration();
+ IASTName name_Point2 = ((IASTNamedTypeSpecifier)point.getDeclSpecifier()).getName();
+ IASTName name_point = point.getDeclarators()[0].getName();
+ IASTDeclarator declarator_point = point.getDeclarators()[0];
+ IASTInitializer [] initializers2 = ((IASTInitializerList) declarator_point.getInitializer()).getInitializers();
+ IASTName name_width2 = ((ICASTFieldDesignator)((ICASTDesignatedInitializer)initializers2[0]).getDesignators()[0]).getName();
+ IASTName name_pos2 = ((ICASTFieldDesignator)((ICASTDesignatedInitializer)initializers2[1]).getDesignators()[0]).getName();
+ IASTName name_xy2 = ((IASTIdExpression)((IASTUnaryExpression)((IASTInitializerExpression)((ICASTDesignatedInitializer)initializers2[1]).getOperandInitializer()).getExpression()).getOperand()).getName();
+
for( int i = 0; i < 2; ++i )
{
- ICASTDesignatedInitializer designatedInitializer = (ICASTDesignatedInitializer) initializers[i];
+ ICASTDesignatedInitializer designatedInitializer = (ICASTDesignatedInitializer) initializers1[i];
assertEquals( designatedInitializer.getDesignators().length, 1 );
ICASTFieldDesignator fieldDesignator = (ICASTFieldDesignator) designatedInitializer.getDesignators()[0];
assertNotNull( fieldDesignator.getName().toString() );
}
+
+ // test tu.getDeclarations(IBinding)
+ IASTName[] decls = tu.getDeclarations(name_Coord2.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_Coord );
+
+ decls = tu.getDeclarations(name_xy.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_xy );
+
+ decls = tu.getDeclarations(name_y2.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_y );
+
+ decls = tu.getDeclarations(name_x2.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_x );
+
+ decls = tu.getDeclarations(name_Point2.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_Point );
+
+ decls = tu.getDeclarations(name_point.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_point );
+
+ decls = tu.getDeclarations(name_width2.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_width );
+
+ decls = tu.getDeclarations(name_pos2.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_pos );
+
+ decls = tu.getDeclarations(name_xy2.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_xy );
}
public void testFnReturningPtrToFn() throws Exception {
@@ -1180,6 +1718,11 @@
assertTrue( ft.getReturnType() instanceof IPointerType );
assertTrue( ((IPointerType) ft.getReturnType()).getType() instanceof IFunctionType );
assertEquals( ft.getParameterTypes().length, 1 );
+
+ // test tu.getDeclarations(IBinding)
+ IASTName[] decls = tu.getDeclarations(def.getDeclarator().getNestedDeclarator().getName().resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], def.getDeclarator().getNestedDeclarator().getName() );
}
// test C99: 6.7.5.3-7 A declaration of a parameter as array of type shall be adjusted to qualified pointer to
@@ -1194,6 +1737,12 @@
IFunctionType ft = f.getType();
assertTrue( ft.getParameterTypes()[0] instanceof IPointerType );
assertTrue( ((IPointerType)ft.getParameterTypes()[0]).isConst() );
+
+ // test tu.getDeclarations(IBinding)
+ IASTName name_parm = ((IASTFunctionDeclarator)def.getDeclarators()[0]).getParameters()[0].getDeclarator().getName();
+ IASTName[] decls = tu.getDeclarations(name_parm.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_parm );
}
public void testFunctionDefTypes() throws Exception {
@@ -1202,12 +1751,12 @@
buffer.append("int (* f3())() {}\n"); //$NON-NLS-1$
IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.C ); //$NON-NLS-1$
- IASTFunctionDefinition def = (IASTFunctionDefinition) tu.getDeclarations()[0];
- IFunction f = (IFunction) def.getDeclarator().getName().resolveBinding();
- def = (IASTFunctionDefinition) tu.getDeclarations()[1];
- IFunction f2 = (IFunction) def.getDeclarator().getName().resolveBinding();
- def = (IASTFunctionDefinition) tu.getDeclarations()[2];
- IFunction f3 = (IFunction) def.getDeclarator().getName().resolveBinding();
+ IASTFunctionDefinition def1 = (IASTFunctionDefinition) tu.getDeclarations()[0];
+ IFunction f = (IFunction) def1.getDeclarator().getName().resolveBinding();
+ IASTFunctionDefinition def2 = (IASTFunctionDefinition) tu.getDeclarations()[1];
+ IFunction f2 = (IFunction) def2.getDeclarator().getName().resolveBinding();
+ IASTFunctionDefinition def3 = (IASTFunctionDefinition) tu.getDeclarations()[2];
+ IFunction f3 = (IFunction) def3.getDeclarator().getName().resolveBinding();
IFunctionType ft = f.getType();
IFunctionType ft2 = f2.getType();
@@ -1219,6 +1768,19 @@
assertTrue( ft3.getReturnType() instanceof IPointerType );
assertTrue( ((IPointerType)ft3.getReturnType()).getType() instanceof IFunctionType );
assertTrue( ((IFunctionType)((IPointerType)ft3.getReturnType()).getType()).getReturnType() instanceof IBasicType );
+
+ // test tu.getDeclarations(IBinding)
+ IASTName[] decls = tu.getDeclarations(def1.getDeclarator().getName().resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], def1.getDeclarator().getName() );
+
+ decls = tu.getDeclarations(def2.getDeclarator().getName().resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], def2.getDeclarator().getName() );
+
+ decls = tu.getDeclarations(def3.getDeclarator().getName().resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], def3.getDeclarator().getName() );
}
// any parameter to type function returning T is adjusted to be pointer to function returning T
@@ -1240,6 +1802,13 @@
IType gt_parm = ((IFunctionType)gt_2).getParameterTypes()[0];
assertTrue( gt_parm instanceof IBasicType );
assertEquals( ((IBasicType)gt_parm).getType(), IBasicType.t_void );
+
+ // test tu.getDeclarations(IBinding)
+ IASTName name_g = def.getDeclarator().getParameters()[0].getDeclarator().getName();
+ IASTName name_g_call = ((IASTIdExpression)((IASTFunctionCallExpression)((IASTReturnStatement)((IASTCompoundStatement)def.getBody()).getStatements()[0]).getReturnValue()).getFunctionNameExpression()).getName();
+ IASTName[] decls = tu.getDeclarations(name_g_call.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_g );
}
public void testArrayPointerFunction() throws Exception {
@@ -1268,6 +1837,11 @@
IType vpt_2_2 = ((IPointerType)vpt_1).getType();
assertTrue( vpt_2_2 instanceof IBasicType );
assertEquals( ((IBasicType)vpt_2_2).getType(), IBasicType.t_int );
+
+ // test tu.getDeclarations(IBinding)
+ IASTName[] decls = tu.getDeclarations(((IASTFunctionDeclarator) decl.getDeclarators()[0]).getNestedDeclarator().getName().resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], ((IASTFunctionDeclarator) decl.getDeclarators()[0]).getNestedDeclarator().getName() );
}
public void testTypedefExample4a() throws Exception {
@@ -1276,22 +1850,22 @@
buffer.append( "v signal(int);\n" ); //$NON-NLS-1$
IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.C );
- IASTSimpleDeclaration decl = (IASTSimpleDeclaration) tu.getDeclarations()[0];
- ITypedef dword = (ITypedef)decl.getDeclarators()[0].getName().resolveBinding();
+ IASTSimpleDeclaration decl1 = (IASTSimpleDeclaration) tu.getDeclarations()[0];
+ ITypedef dword = (ITypedef)decl1.getDeclarators()[0].getName().resolveBinding();
IType dword_t = dword.getType();
assertTrue( dword_t instanceof IBasicType );
assertEquals( ((IBasicType)dword_t).getType(), IBasicType.t_void );
- decl = (IASTSimpleDeclaration) tu.getDeclarations()[1];
- ITypedef v = (ITypedef)decl.getDeclarators()[0].getName().resolveBinding();
+ IASTSimpleDeclaration decl2 = (IASTSimpleDeclaration) tu.getDeclarations()[1];
+ ITypedef v = (ITypedef)decl2.getDeclarators()[0].getName().resolveBinding();
IType v_t_1 = v.getType();
assertTrue( v_t_1 instanceof ITypedef );
IType v_t_2 = ((ITypedef)v_t_1).getType();
assertTrue( v_t_2 instanceof IBasicType );
assertEquals( ((IBasicType)v_t_2).getType(), IBasicType.t_void );
- decl = (IASTSimpleDeclaration) tu.getDeclarations()[2];
- IFunction signal = (IFunction)decl.getDeclarators()[0].getName().resolveBinding();
+ IASTSimpleDeclaration decl3 = (IASTSimpleDeclaration) tu.getDeclarations()[2];
+ IFunction signal = (IFunction)decl3.getDeclarators()[0].getName().resolveBinding();
IFunctionType signal_t = signal.getType();
IType signal_ret = signal_t.getReturnType();
assertTrue( signal_ret instanceof ITypedef );
@@ -1300,6 +1874,22 @@
IType signal_ret3 = ((ITypedef)signal_ret2).getType();
assertTrue( signal_ret3 instanceof IBasicType );
assertEquals( ((IBasicType)signal_ret3).getType(), IBasicType.t_void );
+
+ // test tu.getDeclarations(IBinding)
+ IASTName name_DWORD = decl1.getDeclarators()[0].getName();
+ IASTName name_v = decl2.getDeclarators()[0].getName();
+
+ IASTName[] decls = tu.getDeclarations(name_DWORD.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_DWORD );
+
+ decls = tu.getDeclarations(((IASTNamedTypeSpecifier)decl2.getDeclSpecifier()).getName().resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_DWORD );
+
+ decls = tu.getDeclarations(((IASTNamedTypeSpecifier)decl3.getDeclSpecifier()).getName().resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_v );
}
public void testTypedefExample4b() throws Exception {
@@ -1308,14 +1898,14 @@
buffer.append( "pfv signal(int, pfv);\n" ); //$NON-NLS-1$
IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.C );
- IASTSimpleDeclaration decl = (IASTSimpleDeclaration) tu.getDeclarations()[0];
- ITypedef dword = (ITypedef)decl.getDeclarators()[0].getName().resolveBinding();
+ IASTSimpleDeclaration decl1 = (IASTSimpleDeclaration) tu.getDeclarations()[0];
+ ITypedef dword = (ITypedef)decl1.getDeclarators()[0].getName().resolveBinding();
IType dword_t = dword.getType();
assertTrue( dword_t instanceof IBasicType );
assertEquals( ((IBasicType)dword_t).getType(), IBasicType.t_void );
- decl = (IASTSimpleDeclaration) tu.getDeclarations()[1];
- ITypedef pfv = (ITypedef)decl.getDeclarators()[0].getNestedDeclarator().getName().resolveBinding();
+ IASTSimpleDeclaration decl2 = (IASTSimpleDeclaration) tu.getDeclarations()[1];
+ ITypedef pfv = (ITypedef)decl2.getDeclarators()[0].getNestedDeclarator().getName().resolveBinding();
IType pfv_t_1 = pfv.getType();
assertTrue( pfv_t_1 instanceof IPointerType );
IType pfv_t_2 = ((IPointerType)pfv_t_1).getType();
@@ -1330,8 +1920,8 @@
assertTrue( pfv_t_2_parm instanceof IBasicType );
assertEquals( ((IBasicType)pfv_t_2_parm).getType(), IBasicType.t_int );
- decl = (IASTSimpleDeclaration) tu.getDeclarations()[2];
- IFunction signal = (IFunction)decl.getDeclarators()[0].getName().resolveBinding();
+ IASTSimpleDeclaration decl3 = (IASTSimpleDeclaration) tu.getDeclarations()[2];
+ IFunction signal = (IFunction)decl3.getDeclarators()[0].getName().resolveBinding();
IFunctionType signal_t = signal.getType();
IType signal_ret_1 = signal_t.getReturnType();
assertTrue( signal_ret_1 instanceof ITypedef );
@@ -1361,6 +1951,19 @@
assertTrue( signal_parm_t2_ret_2 instanceof IBasicType );
assertEquals( ((IBasicType)signal_parm_t2_ret_2).getType(), IBasicType.t_void );
assertTrue( ((ITypedef)signal_parm_t2_ret_1).getName().equals("DWORD") ); //$NON-NLS-1$
+
+ // test tu.getDeclarations(IBinding)
+ IASTName name_pfv = decl2.getDeclarators()[0].getNestedDeclarator().getName();
+ IASTName name_pfv1 = ((IASTNamedTypeSpecifier)decl3.getDeclSpecifier()).getName();
+ IASTName name_pfv2 = ((IASTNamedTypeSpecifier)((IASTFunctionDeclarator)decl3.getDeclarators()[0]).getParameters()[1].getDeclSpecifier()).getName();
+
+ IASTName[] decls = tu.getDeclarations(name_pfv1.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_pfv );
+
+ decls = tu.getDeclarations(name_pfv2.resolveBinding());
+ assertEquals( decls.length, 1 );
+ assertEquals( decls[0], name_pfv );
}
public void testTypedefExample4c() throws Exception {
@@ -1433,6 +2036,15 @@
assertFalse( mod.isStatic() );
assertFalse( mod.isRestrict() );
assertFalse( mod.isVolatile() );
+ }
+
+ public void testSimpleMacroGetDeclaration() throws Exception {
+ StringBuffer buffer = new StringBuffer( "#define TEST\n" ); //$NON-NLS-1$
+ buffer.append( "#ifdef TEST\n" ); //$NON-NLS-1$
+ buffer.append( "#define TEST2\n" ); //$NON-NLS-1$
+ buffer.append( "#endif" ); //$NON-NLS-1$
+ IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.C );
+ tu.getDeclarations();
}
}