Skip to main content
aboutsummaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorMarco Stornelli2019-05-24 18:21:59 +0000
committerMarco Stornelli2019-05-30 05:07:38 +0000
commit353315f84ae85704e444482236615415589fc2ac (patch)
tree6c0c06f726fc7f53550e2b1a4f9a1e509a40329a /core
parent188d84eea53631ba35f405b5651f49129f8def88 (diff)
downloadorg.eclipse.cdt-353315f84ae85704e444482236615415589fc2ac.tar.gz
org.eclipse.cdt-353315f84ae85704e444482236615415589fc2ac.tar.xz
org.eclipse.cdt-353315f84ae85704e444482236615415589fc2ac.zip
Bug 303870 - Fix for base template classes
Methods weren't added if the virtual methods were in a base template class. Change-Id: I34b05eeb1e7dc5ce83944a642461eca521764967 Signed-off-by: Marco Stornelli <marco.stornelli@gmail.com>
Diffstat (limited to 'core')
-rwxr-xr-xcore/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/overridemethods/OverrideMethodsRefactoringTest.java37
-rw-r--r--core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/utils/DefinitionFinder.java23
2 files changed, 56 insertions, 4 deletions
diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/overridemethods/OverrideMethodsRefactoringTest.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/overridemethods/OverrideMethodsRefactoringTest.java
index 87d564f1254..7002675e29b 100755
--- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/overridemethods/OverrideMethodsRefactoringTest.java
+++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/overridemethods/OverrideMethodsRefactoringTest.java
@@ -271,6 +271,43 @@ public class OverrideMethodsRefactoringTest extends RefactoringTestBase {
}
//A.h
+ //template<class T>
+ //class Base {
+ //public:
+ // virtual ~Base();
+ // virtual void baseFunc(T *t) const = 0;
+ //};
+ //class X: public Base<int> {
+ //public:
+ // X();
+ // /*$*//*$$*/
+ //};
+ //====================
+ //template<class T>
+ //class Base {
+ //public:
+ // virtual ~Base();
+ // virtual void baseFunc(T *t) const = 0;
+ //};
+ //class X: public Base<int> {
+ //public:
+ // X();
+ // virtual void baseFunc(int *t) const;
+ //};
+
+ //A.cpp
+ //#include "A.h"
+ //====================
+ //#include "A.h"
+ //
+ //void X::baseFunc(int *t) const {
+ //}
+ public void testWithTemplateBaseClass() throws Exception {
+ selectedMethods = new String[] { "baseFunc(int *) {#0,0: int}" };
+ assertRefactoringSuccess();
+ }
+
+ //A.h
//class Base {
//public:
// virtual ~Base();
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/utils/DefinitionFinder.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/utils/DefinitionFinder.java
index 00564d10904..05d27a5f5b4 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/utils/DefinitionFinder.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/utils/DefinitionFinder.java
@@ -25,6 +25,8 @@ import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMember;
+import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
+import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.index.IIndexBinding;
import org.eclipse.cdt.core.index.IIndexFile;
@@ -254,9 +256,22 @@ public class DefinitionFinder {
*/
public static IASTName getMemberDeclaration(ICPPMember member, IASTTranslationUnit contextTu,
CRefactoringContext context, IProgressMonitor pm) throws CoreException, OperationCanceledException {
- IASTName classDefintionName = getDefinition(member.getClassOwner(), contextTu, context, pm);
- if (classDefintionName == null)
- return null;
+ IBinding classBinding = member.getClassOwner();
+ IBinding memberBinding = member;
+ if (member instanceof ICPPSpecialization)
+ memberBinding = ((ICPPSpecialization) member).getSpecializedBinding();
+ IASTName classDefintionName = getDefinition(classBinding, contextTu, context, pm);
+ if (classDefintionName == null) {
+ /*
+ * We didn't find the class definition, check again the template definition then
+ * it was a template instance.
+ */
+ if (classBinding instanceof ICPPTemplateInstance)
+ classBinding = ((ICPPTemplateInstance) classBinding).getTemplateDefinition();
+ classDefintionName = getDefinition(classBinding, contextTu, context, pm);
+ if (classDefintionName == null)
+ return null;
+ }
IASTCompositeTypeSpecifier compositeTypeSpecifier = ASTQueries.findAncestorWithType(classDefintionName,
IASTCompositeTypeSpecifier.class);
IASTTranslationUnit ast = classDefintionName.getTranslationUnit();
@@ -264,7 +279,7 @@ public class DefinitionFinder {
if (index == null) {
return null;
}
- IASTName[] memberDeclarationNames = ast.getDeclarationsInAST(index.adaptBinding(member));
+ IASTName[] memberDeclarationNames = ast.getDeclarationsInAST(index.adaptBinding(memberBinding));
for (IASTName name : memberDeclarationNames) {
if (name.getPropertyInParent() == IASTDeclarator.DECLARATOR_NAME) {
IASTDeclaration declaration = ASTQueries.findAncestorWithType(name, IASTDeclaration.class);

Back to the top