Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[cdt-patch] FIXED 86829- Open Declaration on implicit constructor reference


FIXED 86829- Open Declaration on implicit constructor reference

Devin Steffler
IBM's Eclipse CDT
Ottawa (Palladium), Ontario, Canada


Index: parser/org/eclipse/cdt/core/parser/tests/ast2/AST2SelectionParseTest.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2SelectionParseTest.java,v
retrieving revision 1.1
diff -u -r1.1 AST2SelectionParseTest.java
--- parser/org/eclipse/cdt/core/parser/tests/ast2/AST2SelectionParseTest.java	7 Mar 2005 18:35:39 -0000	1.1
+++ parser/org/eclipse/cdt/core/parser/tests/ast2/AST2SelectionParseTest.java	9 May 2005 18:26:28 -0000
@@ -751,31 +751,6 @@
 		assertEquals(((ICPPClassType)name.resolveBinding()).getName(), "A"); //$NON-NLS-1$
 	}
 	
-	// TODO no template support yet for new AST?
-//	public void testBug72814() throws Exception{
-//	    Writer writer = new StringWriter();
-//	    writer.write( "namespace N{                               \n"); //$NON-NLS-1$
-//	    writer.write( "   template < class T > class AAA { T _t };\n"); //$NON-NLS-1$
-//	    writer.write( "}                                          \n"); //$NON-NLS-1$
-//	    writer.write( "N::AAA<int> a;                             \n"); //$NON-NLS-1$
-//	    
-//	    String code = writer.toString();
-//	    int startIndex = code.indexOf( "AAA<int>" ); //$NON-NLS-1$
-//		int length = "AAA".length(); //$NON-NLS-1$
-//		IASTNode node = parse( code, ParserLanguage.CPP, startIndex, length );
-//		assertNotNull(node);
-//	    
-////	    assertTrue( node instanceof IASTClassSpecifier );
-////	    assertEquals( ((IASTClassSpecifier)node).getName(), "AAA" ); //$NON-NLS-1$
-//	    
-//		length = "AAA<int>".length(); //$NON-NLS-1$ 
-//		node = parse( code, ParserLanguage.CPP, startIndex, length );
-//		assertNotNull(node);
-//	    
-////	    assertTrue( node instanceof IASTClassSpecifier );
-////	    assertEquals( ((IASTClassSpecifier)node).getName(), "AAA" ); //$NON-NLS-1$
-//	}
-	
 	public void testBug72710() throws Exception
 	{
 		Writer writer = new StringWriter();
Index: search/org/eclipse/cdt/core/search/DOMSearchUtil.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/search/org/eclipse/cdt/core/search/DOMSearchUtil.java,v
retrieving revision 1.5
diff -u -r1.5 DOMSearchUtil.java
--- search/org/eclipse/cdt/core/search/DOMSearchUtil.java	3 May 2005 18:48:20 -0000	1.5
+++ search/org/eclipse/cdt/core/search/DOMSearchUtil.java	9 May 2005 18:27:07 -0000
@@ -47,6 +47,7 @@
 import org.eclipse.cdt.core.parser.util.ArrayUtil;
 import org.eclipse.cdt.core.search.ICSearchConstants.LimitTo;
 import org.eclipse.cdt.core.search.ICSearchConstants.SearchFor;
+import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPImplicitMethod;
 import org.eclipse.cdt.internal.core.search.matching.CSearchPattern;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
@@ -88,6 +89,9 @@
     }
     
     private static CSearchPattern createPattern( IBinding binding, LimitTo limitTo, boolean caseSensitive) {
+		if (binding == null)
+			return null;
+		
         // build the SearchFor/pattern based on the IBinding
         SearchFor searchFor = createSearchFor(binding);
         if (binding instanceof IFunction) {
@@ -341,30 +345,49 @@
          if (tu == null) {
              return BLANK_NAME_ARRAY;
          }
-         
-         // fix for 92632
-         IBinding binding = searchName.resolveBinding();
-         if (binding instanceof ICPPTemplateInstance) {
-             if (((ICPPTemplateInstance)binding).getTemplateDefinition() != null)
-                 binding = ((ICPPTemplateInstance)binding).getTemplateDefinition();
-         }
-         
-         if (limitTo == ICSearchConstants.DECLARATIONS) {
-             names = tu.getDeclarations(binding);
-         } else if (limitTo == ICSearchConstants.REFERENCES) {
-             names = tu.getReferences(binding);
-         } else if (limitTo == ICSearchConstants.DEFINITIONS) {
-             names = tu.getDefinitions(binding);
-         } else if (limitTo == ICSearchConstants.ALL_OCCURRENCES){
-             names = tu.getDeclarations(binding);
-             names = (IASTName[])ArrayUtil.addAll(IASTName.class, names, tu.getReferences(binding));
-         } else {  // assume ALL
-             names = tu.getDeclarations(binding);
-             names = (IASTName[])ArrayUtil.addAll(IASTName.class, names, tu.getReferences(binding));
-         }
+		 
+		 IBinding binding = searchName.resolveBinding();
+		 names = getNames(tu, binding, limitTo);
+		 
+		 if (names == null || names.length == 0) { // try alternate strategies
+			 // fix for 92632
+	         if (binding instanceof ICPPTemplateInstance) {
+	             if (((ICPPTemplateInstance)binding).getTemplateDefinition() != null)
+	                 binding = ((ICPPTemplateInstance)binding).getTemplateDefinition();
+	         }
+			 
+			 // TODO Devin fix for 86829
+			 if (binding instanceof CPPImplicitMethod) {
+				 try {
+					binding = ((CPPImplicitMethod)binding).getScope().getScopeName().resolveBinding(); 
+				} catch (DOMException e) {
+				}
+			 }
+			 
+			 names = getNames(tu, binding, limitTo);
+		 }
          
          return names;
     }
+	
+	private static IASTName[] getNames(IASTTranslationUnit tu, IBinding binding, LimitTo limitTo) {
+        IASTName[] names = null;
+		if (limitTo == ICSearchConstants.DECLARATIONS) {
+            names = tu.getDeclarations(binding);
+        } else if (limitTo == ICSearchConstants.REFERENCES) {
+            names = tu.getReferences(binding);
+        } else if (limitTo == ICSearchConstants.DEFINITIONS) {
+            names = tu.getDefinitions(binding);
+        } else if (limitTo == ICSearchConstants.ALL_OCCURRENCES){
+            names = tu.getDeclarations(binding);
+            names = (IASTName[])ArrayUtil.addAll(IASTName.class, names, tu.getReferences(binding));
+        } else {  // assume ALL
+            names = tu.getDeclarations(binding);
+            names = (IASTName[])ArrayUtil.addAll(IASTName.class, names, tu.getReferences(binding));
+        }
+		
+		return names;
+	}
 
     /**
      * The CPPNameCollector used to get IASTNames from an IASTNode.
Index: src/org/eclipse/cdt/ui/tests/DOMAST/DOMAST.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/DOMAST.java,v
retrieving revision 1.39
diff -u -r1.39 DOMAST.java
--- src/org/eclipse/cdt/ui/tests/DOMAST/DOMAST.java	3 May 2005 18:48:22 -0000	1.39
+++ src/org/eclipse/cdt/ui/tests/DOMAST/DOMAST.java	9 May 2005 18:27:40 -0000
@@ -473,6 +473,7 @@
 			 * @see java.lang.Runnable#run()
 			 */
 			public void run() {
+				if (view == null) return;
 				view.refresh();
 				
 				if (view.getTree().getItems().length > 0) {
@@ -684,6 +685,7 @@
    }
 
    public void setContentProvider(ViewContentProvider vcp) {
+	  if (viewer == null) return;
       viewer.setContentProvider(vcp);
    }
    
Index: ui/org/eclipse/cdt/ui/tests/text/selectiontests/SelectionTests.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selectiontests/SelectionTests.java,v
retrieving revision 1.2
diff -u -r1.2 SelectionTests.java
--- ui/org/eclipse/cdt/ui/tests/text/selectiontests/SelectionTests.java	3 May 2005 15:48:31 -0000	1.2
+++ ui/org/eclipse/cdt/ui/tests/text/selectiontests/SelectionTests.java	9 May 2005 18:27:40 -0000
@@ -2,6 +2,8 @@
 
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
+import java.io.StringWriter;
+import java.io.Writer;
 
 import junit.framework.Test;
 import junit.framework.TestCase;
@@ -15,6 +17,7 @@
 import org.eclipse.cdt.core.testplugin.FileManager;
 import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
 import org.eclipse.cdt.internal.core.index.sourceindexer.SourceIndexer;
+import org.eclipse.cdt.internal.core.parser.ParserException;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
@@ -119,7 +122,14 @@
         return file;
     }
     
-    protected IASTNode testF3(IFile file, int offset) {
+	protected IASTNode testF3(IFile file, int offset) throws ParserException {
+		return testF3(file, offset, 0);
+	}
+	
+    protected IASTNode testF3(IFile file, int offset, int length) throws ParserException {
+		if (offset < 0)
+			throw new ParserException("offset can not be less than 0 and was " + offset); //$NON-NLS-1$
+		
         IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
         IEditorPart part = null;
         try {
@@ -129,7 +139,7 @@
         }
         
         if (part instanceof AbstractTextEditor) {
-            ((AbstractTextEditor)part).getSelectionProvider().setSelection(new TextSelection(offset,0));
+            ((AbstractTextEditor)part).getSelectionProvider().setSelection(new TextSelection(offset,length));
             
             final IAction action = ((AbstractTextEditor)part).getAction("OpenDeclarations"); //$NON-NLS-1$
             action.run();
@@ -151,7 +161,14 @@
         return null;
     }
     
-    protected IASTNode testF2(IFile file, int offset) {
+	protected IASTNode testF2(IFile file, int offset) throws ParserException {
+		return testF2(file, offset, 0);
+	}
+	
+    protected IASTNode testF2(IFile file, int offset, int length) throws ParserException {
+		if (offset < 0)
+			throw new ParserException("offset can not be less than 0 and was " + offset); //$NON-NLS-1$
+		
         IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
         IEditorPart part = null;
         try {
@@ -161,7 +178,7 @@
         }
         
         if (part instanceof AbstractTextEditor) {
-            ((AbstractTextEditor)part).getSelectionProvider().setSelection(new TextSelection(offset,0));
+            ((AbstractTextEditor)part).getSelectionProvider().setSelection(new TextSelection(offset,length));
             
             final IAction action = ((AbstractTextEditor)part).getAction("OpenDefinition"); //$NON-NLS-1$
             action.run();
@@ -238,7 +255,7 @@
         buffer.append("struct MyStruct;        // often used in header files\n"); //$NON-NLS-1$
         buffer.append("typedef int NewInt;     // a normal typedef statement\n"); //$NON-NLS-1$
         buffer.append("class MyClass;          // often used in header files\n"); //$NON-NLS-1$
-        buffer.append("int MyInt;\n"); //$NON-NLS-1$
+        buffer.append("int MyInt=2;\n"); //$NON-NLS-1$
         buffer.append("extern const int MyConst = 42;\n"); //$NON-NLS-1$
         buffer.append("void MyFunc(int a) { cout << a << endl; }\n"); //$NON-NLS-1$
         buffer.append("struct MyStruct { int Member1; int Member2; };\n"); //$NON-NLS-1$
@@ -247,7 +264,7 @@
         String code = buffer.toString();
         IFile file = importFile("testBasicDefinition.cpp", code); //$NON-NLS-1$
         
-        int offset = code.indexOf("MyInt;\n") + 2; //$NON-NLS-1$
+        int offset = code.indexOf("MyInt=2;\n") + 2; //$NON-NLS-1$
         IASTNode def = testF2(file, offset);
         IASTNode decl = testF3(file, offset);
         assertTrue(def instanceof IASTName);
@@ -268,7 +285,7 @@
         assertEquals(((ASTNode)decl).getOffset(), 69);
         assertEquals(((ASTNode)decl).getLength(), 7);
         assertEquals(((IASTName)def).toString(), "MyConst"); //$NON-NLS-1$
-        assertEquals(((ASTNode)def).getOffset(), 354);
+        assertEquals(((ASTNode)def).getOffset(), 356);
         assertEquals(((ASTNode)def).getLength(), 7);
         
         offset = code.indexOf("MyFunc(int a)") + 2; //$NON-NLS-1$
@@ -280,7 +297,7 @@
         assertEquals(((ASTNode)decl).getOffset(), 115);
         assertEquals(((ASTNode)decl).getLength(), 6);
         assertEquals(((IASTName)def).toString(), "MyFunc"); //$NON-NLS-1$
-        assertEquals(((ASTNode)def).getOffset(), 373);
+        assertEquals(((ASTNode)def).getOffset(), 375);
         assertEquals(((ASTNode)def).getLength(), 6);
         
         offset = code.indexOf("MyStruct {") + 2; //$NON-NLS-1$
@@ -292,7 +309,7 @@
         assertEquals(((ASTNode)decl).getOffset(), 171);
         assertEquals(((ASTNode)decl).getLength(), 8);
         assertEquals(((IASTName)def).toString(), "MyStruct"); //$NON-NLS-1$
-        assertEquals(((ASTNode)def).getOffset(), 417);
+        assertEquals(((ASTNode)def).getOffset(), 419);
         assertEquals(((ASTNode)def).getLength(), 8);
         
         offset = code.indexOf("MyClass {") + 2; //$NON-NLS-1$
@@ -304,8 +321,93 @@
         assertEquals(((ASTNode)decl).getOffset(), 278);
         assertEquals(((ASTNode)decl).getLength(), 7);
         assertEquals(((IASTName)def).toString(), "MyClass"); //$NON-NLS-1$
-        assertEquals(((ASTNode)def).getOffset(), 463);
+        assertEquals(((ASTNode)def).getOffset(), 465);
         assertEquals(((ASTNode)def).getLength(), 7);
     }
     
+	public void testBasicTemplateInstance() throws Exception{
+	    Writer writer = new StringWriter();
+	    writer.write( "namespace N{                               \n"); //$NON-NLS-1$
+	    writer.write( "   template < class T > class AAA { T _t; };\n"); //$NON-NLS-1$
+	    writer.write( "};                                         \n"); //$NON-NLS-1$
+	    writer.write( "N::AAA<int> a;                             \n"); //$NON-NLS-1$
+	    
+		String code = writer.toString();
+		IFile file = importFile("testBasicTemplateInstance.cpp", code); //$NON-NLS-1$
+        
+        int offset = code.indexOf("AAA<int>"); //$NON-NLS-1$
+        IASTNode def1 = testF2(file, offset, 3);
+        IASTNode decl1 = testF3(file, offset, 3);
+        assertTrue(def1 instanceof IASTName);
+        assertTrue(decl1 instanceof IASTName);
+        assertEquals(((IASTName)decl1).toString(), "AAA"); //$NON-NLS-1$
+        assertEquals(((ASTNode)decl1).getOffset(), 74);
+        assertEquals(((ASTNode)decl1).getLength(), 3);
+        assertEquals(((IASTName)def1).toString(), "AAA"); //$NON-NLS-1$
+        assertEquals(((ASTNode)def1).getOffset(), 74);
+        assertEquals(((ASTNode)def1).getLength(), 3);
+		
+		IASTNode def2 = testF2(file, offset, 8);
+        IASTNode decl2 = testF3(file, offset, 8);
+        assertTrue(def2 instanceof IASTName);
+        assertTrue(decl2 instanceof IASTName);
+        assertEquals(((IASTName)decl2).toString(), "AAA"); //$NON-NLS-1$
+        assertEquals(((ASTNode)decl2).getOffset(), 74);
+        assertEquals(((ASTNode)decl2).getLength(), 3);
+        assertEquals(((IASTName)def2).toString(), "AAA"); //$NON-NLS-1$
+        assertEquals(((ASTNode)def2).getOffset(), 74);
+        assertEquals(((ASTNode)def2).getLength(), 3);
+	}
+	
+	public void testBug86829A() throws Exception {
+        StringBuffer buffer = new StringBuffer();
+        buffer.append("class X {\n"); //$NON-NLS-1$
+        buffer.append("public:\n"); //$NON-NLS-1$
+        buffer.append("X(int); // openReferences fails to find the constructor in g()\n"); //$NON-NLS-1$
+        buffer.append("};\n"); //$NON-NLS-1$
+        buffer.append("X f(X);\n"); //$NON-NLS-1$
+        buffer.append("void g()\n"); //$NON-NLS-1$
+        buffer.append("{\n"); //$NON-NLS-1$
+        buffer.append("X b = f(X(2)); // openDeclarations on X(int) finds the class and not \n"); //$NON-NLS-1$
+        buffer.append("}\n"); //$NON-NLS-1$
+
+		String code = buffer.toString();
+        IFile file = importFile("testBug86829A.cpp", code); //$NON-NLS-1$
+        
+        int offset = code.indexOf("X(2)"); //$NON-NLS-1$
+        IASTNode decl = testF3(file, offset);
+        assertTrue(decl instanceof IASTName);
+        assertEquals(((IASTName)decl).toString(), "X"); //$NON-NLS-1$
+        assertEquals(((ASTNode)decl).getOffset(), 18);
+        assertEquals(((ASTNode)decl).getLength(), 1);
+	}
+	
+	public void testBug86829B() throws Exception {
+        StringBuffer buffer = new StringBuffer();
+        buffer.append("class X {\n"); //$NON-NLS-1$
+        buffer.append("public:\n"); //$NON-NLS-1$
+        buffer.append("operator int();\n"); //$NON-NLS-1$
+        buffer.append("};\n"); //$NON-NLS-1$
+        buffer.append("class Y {\n"); //$NON-NLS-1$
+        buffer.append("public:\n"); //$NON-NLS-1$
+        buffer.append("operator X();\n"); //$NON-NLS-1$
+        buffer.append("};\n"); //$NON-NLS-1$
+        buffer.append("Y a;\n"); //$NON-NLS-1$
+        buffer.append("int c = X(a); // OK: a.operator X().operator int()\n"); //$NON-NLS-1$
+		
+        String code = buffer.toString();
+        IFile file = importFile("testBug86829B.cpp", code); //$NON-NLS-1$
+        
+        int offset = code.indexOf("X(a);"); //$NON-NLS-1$
+        IASTNode def = testF2(file, offset);
+        IASTNode decl = testF3(file, offset);
+        assertTrue(def instanceof IASTName);
+        assertTrue(decl instanceof IASTName);
+        assertEquals(((IASTName)decl).toString(), "X"); //$NON-NLS-1$
+        assertEquals(((ASTNode)decl).getOffset(), 6);
+        assertEquals(((ASTNode)decl).getLength(), 1);
+        assertEquals(((IASTName)def).toString(), "X"); //$NON-NLS-1$
+        assertEquals(((ASTNode)def).getOffset(), 6);
+        assertEquals(((ASTNode)def).getLength(), 1);
+	}
 }
\ No newline at end of file

Back to the top