Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[cdt-patch] fix for bug 43129 - Search: Cannot search for definitions of global variables

fix bug 43129 - report definitions for variables, fields, enumerators and 
namespaces.

core:
- check definitions for variables, fields, enumerators and namespaces
- handle enter/exitLinkageSpecification
  * search/org/eclipse/cdt/internal/core/search/matching/MatchLocator.java
  * 
search/org/eclipse/cdt/internal/core/search/matching/CSearchPattern.java

core.tests:
-added testbug43129() in OtherPatternTests
modified:
* resources/search/include.h
* resources/search/classDecl.cpp
* search/org/eclipse/cdt/core/search/tests/OtherPatternTests.java

ui:
 modify UI to allow selecting Definitions for more items
* src/org/eclipse/cdt/internal/ui/search/CSearchPage.java


tests run on windows & linux

-Andrew 

Index: search/ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/search/ChangeLog,v
retrieving revision 1.28
diff -u -r1.28 ChangeLog
--- search/ChangeLog	25 Sep 2003 19:51:46 -0000	1.28
+++ search/ChangeLog	25 Sep 2003 21:37:05 -0000
@@ -1,4 +1,11 @@
 2003-09-25 Andrew Niefer
+	- bug43129 - Cannot search for definitions of global variables
+		- check definitions for variables, fields, enumerators and namespaces
+		- handle enter/exitLinkageSpecification
+		* search/org/eclipse/cdt/internal/core/search/matching/MatchLocator.java
+		* search/org/eclipse/cdt/internal/core/search/matching/CSearchPattern.java
+
+2003-09-25 Andrew Niefer
 	- partial fix for 43664	Modify Matchlocator to not try and create a link if we have no 
 	resource, instead just use the path
 
Index: search/org/eclipse/cdt/internal/core/search/matching/CSearchPattern.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/search/org/eclipse/cdt/internal/core/search/matching/CSearchPattern.java,v
retrieving revision 1.23
diff -u -r1.23 CSearchPattern.java
--- search/org/eclipse/cdt/internal/core/search/matching/CSearchPattern.java	24 Sep 2003 13:36:40 -0000	1.23
+++ search/org/eclipse/cdt/internal/core/search/matching/CSearchPattern.java	25 Sep 2003 21:37:06 -0000
@@ -132,6 +132,7 @@
 		if( limitTo == ALL_OCCURRENCES ){
 			OrPattern orPattern = new OrPattern();
 			orPattern.addPattern( createNamespacePattern( patternString, DECLARATIONS, matchMode, caseSensitive ) );
+			orPattern.addPattern( createNamespacePattern( patternString, DEFINITIONS, matchMode, caseSensitive ) );
 			orPattern.addPattern( createNamespacePattern( patternString, REFERENCES, matchMode, caseSensitive ) );
 			return orPattern;
 		}
@@ -190,6 +191,7 @@
 			OrPattern orPattern = new OrPattern();
 			orPattern.addPattern( createFieldPattern( patternString, searchFor, DECLARATIONS, matchMode, caseSensitive ) );
 			orPattern.addPattern( createFieldPattern( patternString, searchFor, REFERENCES, matchMode, caseSensitive ) );
+			orPattern.addPattern( createFieldPattern( patternString, searchFor, DEFINITIONS, matchMode, caseSensitive ) );
 			return orPattern;
 		}
 		
Index: search/org/eclipse/cdt/internal/core/search/matching/MatchLocator.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/search/org/eclipse/cdt/internal/core/search/matching/MatchLocator.java,v
retrieving revision 1.32
diff -u -r1.32 MatchLocator.java
--- search/org/eclipse/cdt/internal/core/search/matching/MatchLocator.java	25 Sep 2003 19:51:46 -0000	1.32
+++ search/org/eclipse/cdt/internal/core/search/matching/MatchLocator.java	25 Sep 2003 21:37:06 -0000
@@ -116,7 +116,6 @@
 	public void acceptASMDefinition(IASTASMDefinition asmDefinition) 			{	}
 	public void acceptAbstractTypeSpecDeclaration(IASTAbstractTypeSpecifierDeclaration abstractDeclaration) {}
 
-	public void enterLinkageSpecification(IASTLinkageSpecification linkageSpec) {	}
 	public void enterTemplateDeclaration(IASTTemplateDeclaration declaration) 	{	}
 	public void enterTemplateSpecialization(IASTTemplateSpecialization specialization) 		{	}
 	public void enterTemplateInstantiation(IASTTemplateInstantiation instantiation) {	}
@@ -124,11 +123,17 @@
 	public void exitTemplateDeclaration(IASTTemplateDeclaration declaration) 	{}
 	public void exitTemplateSpecialization(IASTTemplateSpecialization specialization) 		{	}
 	public void exitTemplateExplicitInstantiation(IASTTemplateInstantiation instantiation) 	{	}
-	public void exitLinkageSpecification(IASTLinkageSpecification linkageSpec) 	{	}
-
+	
 	public void enterCodeBlock(IASTCodeScope scope) {	}
 	public void exitCodeBlock(IASTCodeScope scope) 	{	}
 	
+	public void enterLinkageSpecification(IASTLinkageSpecification linkageSpec){
+		pushScope( linkageSpec );	
+	}
+
+	public void exitLinkageSpecification(IASTLinkageSpecification linkageSpec){
+		popScope();
+	}
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#acceptParameterReference(org.eclipse.cdt.internal.core.parser.ast.complete.ASTParameterReference)
@@ -157,12 +162,27 @@
 	
 	public void acceptVariable(IASTVariable variable){
 		lastDeclaration = variable;
-		check( DECLARATIONS, variable );   
+		
+		check( DECLARATIONS, variable );
+		
+		//A declaration is a definition unless...:
+		//it contains the extern specifier or a linkage-spec and no initializer
+		if( variable.getInitializerClause() != null ||
+		    ( !variable.isExtern() && !(currentScope instanceof IASTLinkageSpecification) ) ){
+			check( DEFINITIONS, variable );
+		}
 	}
 	
 	public void acceptField(IASTField field){
-		lastDeclaration = field; 
-		check( DECLARATIONS, field ); 	   
+		lastDeclaration = field;
+		if( currentScope instanceof IASTClassSpecifier ){
+			check( DECLARATIONS, field ); 	   
+			if( !field.isStatic() ){
+				check( DEFINITIONS, field ); 
+			}
+		} else {
+			check( DEFINITIONS, field );
+		}
 	}
 	
 	public void acceptEnumerationSpecifier(IASTEnumerationSpecifier enumeration){
@@ -173,6 +193,7 @@
 			IASTEnumerator enumerator = (IASTEnumerator) iter.next();
 			lastDeclaration = enumerator;
 			check ( DECLARATIONS, enumerator );
+			check ( DEFINITIONS, enumerator );
 		}  
 	}
 		
@@ -240,6 +261,7 @@
 	public void enterNamespaceDefinition(IASTNamespaceDefinition namespaceDefinition) {
 		lastDeclaration = namespaceDefinition;
 		check( DECLARATIONS, namespaceDefinition );
+		check( DEFINITIONS, namespaceDefinition );
 		pushScope( namespaceDefinition );			
 	}
 
Index: ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core.tests/ChangeLog,v
retrieving revision 1.115
diff -u -r1.115 ChangeLog
--- ChangeLog	25 Sep 2003 19:51:50 -0000	1.115
+++ ChangeLog	25 Sep 2003 21:37:19 -0000
@@ -1,3 +1,10 @@
+2003-09-25 Andrew Niefer
+	-bug43129 - Cannot search for definitions of global variables
+		-added testbug43129() in OtherPatternTests
+		* resources/search/include.h
+		* resources/search/classDecl.cpp
+		* search/org/eclipse/cdt/core/search/tests/OtherPatternTests.java
+
 2003-09-25 Hoda Amer
 	Enabled CompleteParseASTExpressionTest.testPostfixTypenameIdentifier()
 	
Index: resources/search/classDecl.cpp
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core.tests/resources/search/classDecl.cpp,v
retrieving revision 1.11
diff -u -r1.11 classDecl.cpp
--- resources/search/classDecl.cpp	18 Sep 2003 15:14:59 -0000	1.11
+++ resources/search/classDecl.cpp	25 Sep 2003 21:37:19 -0000
@@ -61,4 +61,18 @@
 
 Head * Head::operator += ( int index ){
 	return array[ index ];
-}
\ No newline at end of file
+}
+
+extern int externalInt;
+extern int externalIntWithInitializer = 2;
+extern "C" int externCInt;
+extern "C" int externCIntWithInitializer = 3;
+
+void forwardFunction() { }
+void normalFunction()  { }
+
+void DeclsAndDefns::forwardMethod(){ }
+
+int DeclsAndDefns::staticField = 5;
+
+
Index: resources/search/include.h
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core.tests/resources/search/include.h,v
retrieving revision 1.2
diff -u -r1.2 include.h
--- resources/search/include.h	18 Sep 2003 15:14:59 -0000	1.2
+++ resources/search/include.h	25 Sep 2003 21:37:19 -0000
@@ -9,4 +9,15 @@
 	Head ** array;
 };
 
+class DeclsAndDefns{
+	static int staticField;
+	int nonStaticField;
+	
+	void forwardMethod();
+	void inlineMethod() {}
+};
+
+void forwardFunction();
+
+
 #endif
Index: search/org/eclipse/cdt/core/search/tests/OtherPatternTests.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core.tests/search/org/eclipse/cdt/core/search/tests/OtherPatternTests.java,v
retrieving revision 1.14
diff -u -r1.14 OtherPatternTests.java
--- search/org/eclipse/cdt/core/search/tests/OtherPatternTests.java	25 Sep 2003 19:51:50 -0000	1.14
+++ search/org/eclipse/cdt/core/search/tests/OtherPatternTests.java	25 Sep 2003 21:37:19 -0000
@@ -240,6 +240,73 @@
 		assertEquals( matches.size(), 3 );
 	}
 	
+	public void testBug43129(){
+		ICSearchPattern pattern = SearchEngine.createSearchPattern( "externalInt", VAR, DECLARATIONS, true );
+		search( workspace, pattern, scope, resultCollector );
+		Set matches = resultCollector.getSearchResults();
+		assertEquals( matches.size(), 1 );
+		
+		pattern = SearchEngine.createSearchPattern( "externalInt", VAR, DEFINITIONS, true );
+		search( workspace, pattern, scope, resultCollector );
+		matches = resultCollector.getSearchResults();
+		assertEquals( matches.size(), 0 );
+		
+		pattern = SearchEngine.createSearchPattern( "externalIntWithInitializer", VAR, DECLARATIONS, true );
+		search( workspace, pattern, scope, resultCollector );
+		matches = resultCollector.getSearchResults();
+		assertEquals( matches.size(), 1 );
+		
+		pattern = SearchEngine.createSearchPattern( "externalIntWithInitializer", VAR, DEFINITIONS, true );
+		search( workspace, pattern, scope, resultCollector );
+		matches = resultCollector.getSearchResults();
+		assertEquals( matches.size(), 1 );
+		
+		pattern = SearchEngine.createSearchPattern( "externCInt", VAR, DECLARATIONS, true );
+		search( workspace, pattern, scope, resultCollector );
+		matches = resultCollector.getSearchResults();
+		assertEquals( matches.size(), 1 );
+		
+		pattern = SearchEngine.createSearchPattern( "externCInt", VAR, DEFINITIONS, true );
+		search( workspace, pattern, scope, resultCollector );
+		matches = resultCollector.getSearchResults();
+		assertEquals( matches.size(), 0 );
+		
+		pattern = SearchEngine.createSearchPattern( "externCIntWithInitializer", VAR, DECLARATIONS, true );
+		search( workspace, pattern, scope, resultCollector );
+		matches = resultCollector.getSearchResults();
+		assertEquals( matches.size(), 1 );
+		
+		pattern = SearchEngine.createSearchPattern( "externCIntWithInitializer", VAR, DEFINITIONS, true );
+		search( workspace, pattern, scope, resultCollector );
+		matches = resultCollector.getSearchResults();
+		assertEquals( matches.size(), 1 );
+		
+		pattern = SearchEngine.createSearchPattern( "forwardFunction", FUNCTION, ALL_OCCURRENCES, true );
+		search( workspace, pattern, scope, resultCollector );
+		matches = resultCollector.getSearchResults();
+		assertEquals( matches.size(), 2 );
+		
+		pattern = SearchEngine.createSearchPattern( "normalFunction", FUNCTION, DECLARATIONS, true );
+		search( workspace, pattern, scope, resultCollector );
+		matches = resultCollector.getSearchResults();
+		assertEquals( matches.size(), 1 );
+		
+		pattern = SearchEngine.createSearchPattern( "normalFunction", FUNCTION, DEFINITIONS, true );
+		search( workspace, pattern, scope, resultCollector );
+		matches = resultCollector.getSearchResults();
+		assertEquals( matches.size(), 1 );
+		
+		pattern = SearchEngine.createSearchPattern( "forwardMethod", METHOD, ALL_OCCURRENCES, true );
+		search( workspace, pattern, scope, resultCollector );
+		matches = resultCollector.getSearchResults();
+		assertEquals( matches.size(), 2 );
+		
+		pattern = SearchEngine.createSearchPattern( "staticField", FIELD, ALL_OCCURRENCES, true );
+		search( workspace, pattern, scope, resultCollector );
+		matches = resultCollector.getSearchResults();
+		assertEquals( matches.size(), 2 );
+	}
+	
 	public void testNoResourceSearching(){
 		String pluginRoot = org.eclipse.core.runtime.Platform.getPlugin("org.eclipse.cdt.core.tests").find(new Path("/")).getFile();
 		String path = pluginRoot + "resources/search/include.h";
@@ -256,5 +323,4 @@
 		Set matches = resultCollector.getSearchResults();
 		assertEquals( matches.size(), 4 );
 	}
-	
 }
Index: ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui/ChangeLog,v
retrieving revision 1.191
diff -u -r1.191 ChangeLog
--- ChangeLog	25 Sep 2003 19:51:42 -0000	1.191
+++ ChangeLog	25 Sep 2003 21:37:29 -0000
@@ -1,3 +1,8 @@
+2003-09-25 Andrew Niefer
+	-bug43129 - Search: Cannot search for definitions of global variables
+		- modify UI to allow selecting Definitions for more items
+		* src/org/eclipse/cdt/internal/ui/search/CSearchPage.java
+
 2003-09-25 Hoda Amer
 	Solution to bug#43646: Code Assist won't work if missing end bracket
 
Index: src/org/eclipse/cdt/internal/ui/search/CSearchPage.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchPage.java,v
retrieving revision 1.10
diff -u -r1.10 CSearchPage.java
--- src/org/eclipse/cdt/internal/ui/search/CSearchPage.java	22 Sep 2003 15:17:30 -0000	1.10
+++ src/org/eclipse/cdt/internal/ui/search/CSearchPage.java	25 Sep 2003 21:37:30 -0000
@@ -295,19 +295,17 @@
 	
 	private void setLimitTo( List searchFor ) {
 		HashSet set = new HashSet();
-
-		set.add( DEFINITIONS );
+		
 		set.add( DECLARATIONS );
 		set.add( REFERENCES );
 		set.add( ALL_OCCURRENCES );
 				
 		for (Iterator iter = searchFor.iterator(); iter.hasNext();) {
 			SearchFor element = (SearchFor) iter.next();
-			if( element != FUNCTION && element != METHOD ){
-				set.remove( DEFINITIONS );
+			if( element == FUNCTION || element == METHOD || element == VAR || element == FIELD || element == NAMESPACE ){
+				set.add( DEFINITIONS );
 				break;
 			}
-			
 		}
 		
 		for( int i = 0; i < fLimitTo.length; i++ )

Back to the top