diff options
author | Marco Stornelli | 2019-05-24 18:21:59 +0000 |
---|---|---|
committer | Marco Stornelli | 2019-05-30 05:07:38 +0000 |
commit | 353315f84ae85704e444482236615415589fc2ac (patch) | |
tree | 6c0c06f726fc7f53550e2b1a4f9a1e509a40329a /core | |
parent | 188d84eea53631ba35f405b5651f49129f8def88 (diff) | |
download | org.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')
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); |