From c032266686da4fe3061d76aa7717de71bfcf0f5b Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Mon, 14 Jul 2008 14:00:43 +0000 Subject: [PATCH] Proper implementation of ICPPClassType.getMethods() for all subclasses, bug 240599. --- .../core/dom/parser/cpp/CPPClassInstance.java | 2 +- .../parser/cpp/CPPClassSpecialization.java | 3 +- .../core/dom/parser/cpp/CPPClassTemplate.java | 2 +- .../core/dom/parser/cpp/CPPClassType.java | 18 +++++++++- .../core/dom/parser/cpp/ClassTypeMixin.java | 15 -------- .../pdom/dom/cpp/PDOMCPPClassInstance.java | 11 ++++-- .../dom/cpp/PDOMCPPClassSpecialization.java | 11 ++++-- .../core/pdom/dom/cpp/PDOMCPPClassType.java | 12 ++----- .../dom/cpp/PDOMCPPDeferredClassInstance.java | 7 ++-- .../eclipse/cdt/ui/tests/BaseUITestCase.java | 18 +++++++--- .../callhierarchy/CallHierarchyBugs.java | 34 +++++++++++++++++-- 11 files changed, 89 insertions(+), 44 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstance.java index a5822db8f47..ba4effa166d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstance.java @@ -77,7 +77,7 @@ public class CPPClassInstance extends CPPInstance implements ICPPClassType { } public ICPPMethod[] getMethods() throws DOMException { - return null; + return CPPClassType.getMethods(this); } public ICPPMethod[] getAllDeclaredMethods() throws DOMException { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java index 76d848095c6..c19db9aede2 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java @@ -143,8 +143,7 @@ public class CPPClassSpecialization extends CPPSpecialization implements * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType#getMethods() */ public ICPPMethod[] getMethods() throws DOMException { - // TODO Auto-generated method stub - return null; + return CPPClassType.getMethods(this); } /* (non-Javadoc) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java index 40cda105219..5a4ac2011b4 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java @@ -222,7 +222,7 @@ public class CPPClassTemplate extends CPPTemplateDefinition implements } public ICPPMethod[] getMethods() throws DOMException { - return mixin.getMethods(); + return CPPClassType.getMethods(this); } public ICPPMethod[] getAllDeclaredMethods() throws DOMException { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassType.java index 9faf207e688..80c40b50f6c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassType.java @@ -49,6 +49,7 @@ import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.CharArrayUtils; +import org.eclipse.cdt.core.parser.util.ObjectSet; import org.eclipse.cdt.internal.core.dom.Linkage; import org.eclipse.cdt.internal.core.dom.parser.ASTNode; import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; @@ -61,6 +62,21 @@ import org.eclipse.core.runtime.PlatformObject; * @author aniefer */ public class CPPClassType extends PlatformObject implements ICPPInternalClassTypeMixinHost { + + public static ICPPMethod[] getMethods(ICPPClassType ct) throws DOMException { + ObjectSet set = new ObjectSet(4); + set.addAll(ct.getDeclaredMethods()); + ICPPClassScope scope = (ICPPClassScope) ct.getCompositeScope(); + set.addAll( scope.getImplicitMethods() ); + ICPPBase [] bases = ct.getBases(); + for (ICPPBase base : bases) { + IBinding b = base.getBaseClass(); + if( b instanceof ICPPClassType ) + set.addAll( ((ICPPClassType)b).getMethods() ); + } + return set.keyArray(ICPPMethod.class); + } + public static class CPPClassTypeProblem extends ProblemBinding implements ICPPClassType{ public CPPClassTypeProblem( IASTNode node, int id, char[] arg ) { super( node, id, arg ); @@ -399,7 +415,7 @@ public class CPPClassType extends PlatformObject implements ICPPInternalClassTyp } public ICPPMethod[] getMethods() throws DOMException { - return mixin.getMethods(); + return getMethods(this); } public ICPPMethod[] getAllDeclaredMethods() throws DOMException { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeMixin.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeMixin.java index 76d489396f4..817adf2d4f7 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeMixin.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeMixin.java @@ -124,21 +124,6 @@ class ClassTypeMixin { return bindings; } - public ICPPMethod[] getMethods() throws DOMException { - ObjectSet set = new ObjectSet(4); - set.addAll(getDeclaredMethods()); - ICPPClassScope scope = (ICPPClassScope) host.getCompositeScope(); - set.addAll( scope.getImplicitMethods() ); - ICPPBase [] bases = getBases(); - for (ICPPBase base : bases) { - IBinding b = base.getBaseClass(); - if( b instanceof ICPPClassType ) - set.addAll( ((ICPPClassType)b).getMethods() ); - } - return set.keyArray(ICPPMethod.class); - } - - public ICPPField[] getDeclaredFields() throws DOMException { if( host.getDefinition() == null ){ host.checkForDefinition(); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassInstance.java index 788eb52c30c..281f6ff3ac3 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassInstance.java @@ -6,8 +6,9 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * QNX - Initial API and implementation - * Andrew Ferguson (Symbian) + * QNX - Initial API and implementation + * Andrew Ferguson (Symbian) + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom.dom.cpp; @@ -41,6 +42,7 @@ import org.eclipse.cdt.core.index.IIndexFileSet; import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassScope; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassType; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPClassSpecializationScope; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; @@ -184,11 +186,14 @@ class PDOMCPPClassInstance extends PDOMCPPInstance implements public ICPPField[] getDeclaredFields() throws DOMException { fail(); return null; } public IField[] getFields() throws DOMException { fail(); return null; } public IBinding[] getFriends() throws DOMException { fail(); return null; } - public ICPPMethod[] getMethods() throws DOMException { fail(); return null; } public ICPPClassType[] getNestedClasses() throws DOMException { fail(); return null; } @Override public Object clone() {fail();return null;} + public ICPPMethod[] getMethods() throws DOMException { + return CPPClassType.getMethods(this); + } + public ICPPClassType getClassType() { return this; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java index 1fa4da23953..afd249896b3 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java @@ -6,8 +6,9 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * QNX - Initial API and implementation - * Andrew Ferguson (Symbian) + * QNX - Initial API and implementation + * Andrew Ferguson (Symbian) + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom.dom.cpp; @@ -37,6 +38,7 @@ import org.eclipse.cdt.core.index.IIndexFileSet; import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassScope; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassType; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPClassSpecializationScope; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBase; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics; @@ -216,9 +218,12 @@ class PDOMCPPClassSpecialization extends PDOMCPPSpecialization implements //ICPPClassType unimplemented public IField[] getFields() throws DOMException { fail(); return null; } public IBinding[] getFriends() throws DOMException { fail(); return null; } - public ICPPMethod[] getMethods() throws DOMException { fail(); return null; } public ICPPClassType[] getNestedClasses() throws DOMException { fail(); return null; } + public ICPPMethod[] getMethods() throws DOMException { + return CPPClassType.getMethods(this); + } + public IScope getCompositeScope() throws DOMException { return this; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java index f4d7f5c2ee1..ca36f131072 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java @@ -47,6 +47,7 @@ import org.eclipse.cdt.core.parser.util.CharArrayMap; import org.eclipse.cdt.internal.core.Util; import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassScope; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassType; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics; import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants; import org.eclipse.cdt.internal.core.index.IIndexScope; @@ -224,15 +225,8 @@ class PDOMCPPClassType extends PDOMCPPBinding implements ICPPClassType, } } - public ICPPMethod[] getMethods() throws DOMException { - try { - PDOMClassUtil.MethodCollector methods = new PDOMClassUtil.MethodCollector(true); - acceptInHierarchy(this, new HashSet(), methods); - return methods.getMethods(); - } catch (CoreException e) { - CCorePlugin.log(e); - return new ICPPMethod[0]; - } + public ICPPMethod[] getMethods() throws DOMException { + return CPPClassType.getMethods(this); } public ICPPMethod[] getImplicitMethods() { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java index 01aa0dbe9bf..827d2c0fc10 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java @@ -162,11 +162,14 @@ class PDOMCPPDeferredClassInstance extends PDOMCPPInstance implements ICPPDeferr public ICPPField[] getDeclaredFields() throws DOMException { fail(); return null; } public IField[] getFields() throws DOMException { fail(); return null; } public IBinding[] getFriends() throws DOMException { fail(); return null; } - public ICPPMethod[] getMethods() throws DOMException { fail(); return null; } public ICPPClassType[] getNestedClasses() throws DOMException { fail(); return null; } @Override public Object clone() {fail();return null;} - + + public ICPPMethod[] getMethods() throws DOMException { + return ICPPMethod.EMPTY_CPPMETHOD_ARRAY; + } + public IBinding resolvePartially(ICPPUnknownBinding parentBinding, ObjectMap argMap, ICPPScope instantiationScope) { IType[] arguments = getArguments(); IType[] newArgs = CPPTemplates.instantiateTypes(arguments, argMap, instantiationScope); diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/BaseUITestCase.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/BaseUITestCase.java index 0b31ff7ade5..a8d7afa1816 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/BaseUITestCase.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/BaseUITestCase.java @@ -67,6 +67,7 @@ public class BaseUITestCase extends BaseTestCase { /* (non-Javadoc) * @see org.eclipse.cdt.core.testplugin.util.BaseTestCase#setUp() */ + @Override protected void setUp() throws Exception { super.setUp(); } @@ -74,6 +75,7 @@ public class BaseUITestCase extends BaseTestCase { /* (non-Javadoc) * @see org.eclipse.cdt.core.testplugin.util.BaseTestCase#tearDown() */ + @Override protected void tearDown() throws Exception { runEventQueue(0); super.tearDown(); @@ -249,13 +251,13 @@ public class BaseUITestCase extends BaseTestCase { hs.executeCommand(commandID, null); } - private Control[] findControls(Control w, Class clazz) { - ArrayList result= new ArrayList(); + private Control[] findControls(Control w, Class clazz) { + ArrayList result= new ArrayList(); findControls(w, clazz, result); - return (Control[]) result.toArray(new Control[result.size()]); + return result.toArray(new Control[result.size()]); } - private void findControls(Control w, Class clazz, List result) { + private void findControls(Control w, Class clazz, List result) { if (clazz.isInstance(w)) { result.add(w); } @@ -271,7 +273,9 @@ public class BaseUITestCase extends BaseTestCase { final protected TreeItem checkTreeNode(IViewPart part, int i0, String label) { Tree tree= null; TreeItem root= null; + StringBuilder cands= new StringBuilder(); for (int i=0; i<400; i++) { + cands.setLength(0); Control[] trees= findControls(part.getSite().getShell(), Tree.class); for (int j = 0; j < trees.length; j++) { try { @@ -280,6 +284,10 @@ public class BaseUITestCase extends BaseTestCase { if (label.equals(root.getText())) { return root; } + if (j > 0) { + cands.append('|'); + } + cands.append(root.getText()); } catch (SWTException e) { // in case widget was disposed, item may be replaced @@ -292,7 +300,7 @@ public class BaseUITestCase extends BaseTestCase { } assertNotNull("No tree in viewpart", tree); assertNotNull("Tree node " + label + "{" + i0 + "} does not exist!", root); - assertEquals(label, root.getText()); + assertEquals(label, cands.toString()); return root; } diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/callhierarchy/CallHierarchyBugs.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/callhierarchy/CallHierarchyBugs.java index b6c666f0682..f7b2e522212 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/callhierarchy/CallHierarchyBugs.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/callhierarchy/CallHierarchyBugs.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007 Wind River Systems, Inc. and others. + * Copyright (c) 2007, 2008 Wind River Systems, Inc. and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -8,7 +8,6 @@ * Contributors: * Markus Schorn - initial API and implementation *******************************************************************************/ - package org.eclipse.cdt.ui.tests.callhierarchy; import junit.framework.Test; @@ -43,6 +42,7 @@ public class CallHierarchyBugs extends CallHierarchyBaseTest { return suite(CallHierarchyBugs.class); } + @Override protected void setUp() throws Exception { super.setUp(); restoreAllParts(); @@ -249,4 +249,34 @@ public class CallHierarchyBugs extends CallHierarchyBaseTest { checkTreeNode(item, 1, "Derived::vmethod()"); checkTreeNode(item, 2, null); } + + // template class CSome { + // public: + // T Foo (const T& x) { return 2*x; } + // }; + // template <> class CSome { + // public: + // int Foo (const int& x) { return 3*x; } + // }; + // void test() { + // CSome X; + // X.Foo(3); + // } + public void testMethodInstance_Bug240599() throws Exception { + String content= getContentsForTest(1)[0].toString(); + IFile file= createFile(getProject(), "CSome.cpp", content); + waitForIndexer(fIndex, file, CallHierarchyBaseTest.INDEXER_WAIT_TIME); + + final CHViewPart ch= (CHViewPart) activateView(CUIPlugin.ID_CALL_HIERARCHY); + final IWorkbenchWindow workbenchWindow = ch.getSite().getWorkbenchWindow(); + + // open editor, check outline + CEditor editor= openEditor(file); + int idx = content.indexOf("Foo(3)"); + editor.selectAndReveal(idx, 0); + openCallHierarchy(editor, true); + Tree chTree= checkTreeNode(ch, 0, "CSome::Foo(const int &)").getParent(); + TreeItem item= checkTreeNode(chTree, 0, 0, "test()"); + checkTreeNode(chTree, 0, 1, null); + } }