diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/implementmethod/ImplementMethodRefactoringTest.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/implementmethod/ImplementMethodRefactoringTest.java index 0bba6e7158a..036cd077ab4 100755 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/implementmethod/ImplementMethodRefactoringTest.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/implementmethod/ImplementMethodRefactoringTest.java @@ -936,4 +936,21 @@ public class ImplementMethodRefactoringTest extends RefactoringTestBase { public void testNoexpect_Bug562722() throws Exception { assertRefactoringSuccess(); } + + //A.h + // + //struct Test {}; + //class TestClass { + //public: + // /*$*/Test foo();/*$$*/ + //}; + // + + //A.cpp + //==================== + //Test TestClass::foo() { + //} + public void testWithClassAsReturnType_Bug562896() throws Exception { + assertRefactoringSuccess(); + } } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/implementmethod/ImplementMethodRefactoring.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/implementmethod/ImplementMethodRefactoring.java index 6392909f163..e3338e918de 100755 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/implementmethod/ImplementMethodRefactoring.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/implementmethod/ImplementMethodRefactoring.java @@ -23,6 +23,8 @@ import java.util.Map; import org.eclipse.cdt.core.dom.ast.ASTNodeFactoryFactory; import org.eclipse.cdt.core.dom.ast.ASTVisitor; +import org.eclipse.cdt.core.dom.ast.DOMException; +import org.eclipse.cdt.core.dom.ast.EScopeKind; import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier; import org.eclipse.cdt.core.dom.ast.IASTDeclaration; import org.eclipse.cdt.core.dom.ast.IASTDeclarator; @@ -321,9 +323,19 @@ public class ImplementMethodRefactoring extends CRefactoring { * we could miss the fully qualified name. */ if (declSpecifier instanceof ICPPASTNamedTypeSpecifier) { - ICPPASTQualifiedName qName = createQualifiedNameFor((IASTNamedTypeSpecifier) declSpecifier, - functionDeclarator, declarationParent, insertLocation, functionOffset); - ((IASTNamedTypeSpecifier) declSpecifier).setName(qName); + IBinding binding = ((ICPPASTNamedTypeSpecifier) methodDeclaration.getDeclSpecifier()).getName() + .resolveBinding(); + try { + if (binding.getScope().getKind() == EScopeKind.eClassType) { + if (!(((ICPPASTNamedTypeSpecifier) declSpecifier).getName() instanceof ICPPASTQualifiedName)) { + ICPPASTQualifiedName qName = createQualifiedNameFor((IASTNamedTypeSpecifier) declSpecifier, + functionDeclarator, declarationParent, insertLocation, functionOffset); + ((IASTNamedTypeSpecifier) declSpecifier).setName(qName); + } + } + } catch (DOMException | CoreException e) { + CUIPlugin.log(e); + } } if (declSpecifier instanceof ICPPASTDeclSpecifier) {