Skip to main content

[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();
     }
 
 }

Back to the top