[
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