diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java index 62ee1a8ca98..c7b7ff51042 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java @@ -839,7 +839,8 @@ public class ClassTypeHelper { /** * Returns all methods found in the index, that override the given {@code method}. */ - public static ICPPMethod[] findOverriders(IIndex index, ICPPMethod method) throws CoreException { + public static ICPPMethod[] findOverriders(IIndex index, ICPPMethod method, IASTNode point) + throws CoreException { if (!isVirtual(method)) return ICPPMethod.EMPTY_CPPMETHOD_ARRAY; @@ -848,18 +849,18 @@ public class ClassTypeHelper { return ICPPMethod.EMPTY_CPPMETHOD_ARRAY; ICPPClassType[] subclasses= getSubClasses(index, mcl); - return findOverriders(subclasses, method); + return findOverriders(subclasses, method, null); } /** * Returns all methods belonging to the given set of classes that override the given {@code method}. */ - public static ICPPMethod[] findOverriders(ICPPClassType[] subclasses, ICPPMethod method) { + public static ICPPMethod[] findOverriders(ICPPClassType[] subclasses, ICPPMethod method, IASTNode point) { final char[] mname= method.getNameCharArray(); final ICPPFunctionType mft= method.getType(); final ArrayList result= new ArrayList<>(); for (ICPPClassType subClass : subclasses) { - ICPPMethod[] methods= subClass.getDeclaredMethods(); + ICPPMethod[] methods= ClassTypeHelper.getDeclaredMethods(subClass, point); for (ICPPMethod candidate : methods) { if (CharArrayUtils.equals(mname, candidate.getNameCharArray()) && functionTypesAllowOverride(mft, candidate.getType())) { diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CHQueries.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CHQueries.java index d0958d2b0f9..22ef847ea45 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CHQueries.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CHQueries.java @@ -177,7 +177,7 @@ public class CHQueries { * if there are none. */ static ICElement[] findOverriders(IIndex index, ICPPMethod binding) throws CoreException { - IBinding[] virtualOverriders= ClassTypeHelper.findOverriders(index, binding); + IBinding[] virtualOverriders= ClassTypeHelper.findOverriders(index, binding, null); if (virtualOverriders.length > 0) { ArrayList list= new ArrayList(); list.addAll(Arrays.asList(IndexUI.findRepresentative(index, binding))); diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/rename/CRenameMethodProcessor.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/rename/CRenameMethodProcessor.java index 9079f9d2f84..6c7fac53eff 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/rename/CRenameMethodProcessor.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/rename/CRenameMethodProcessor.java @@ -100,6 +100,7 @@ public class CRenameMethodProcessor extends CRenameGlobalProcessor { CRefactoringArgument argument= getArgument(); IBinding binding= argument.getBinding(); + IASTNode node= ASTInternal.getPhysicalNodeOfScope(argument.getScope()); ArrayList bindings= new ArrayList<>(); if (binding != null) { recordRename(binding); @@ -110,7 +111,7 @@ public class CRenameMethodProcessor extends CRenameGlobalProcessor { try { IBinding[] bs= ClassTypeHelper.findOverridden(m, argument.getTranslationUnit()); bindings.addAll(Arrays.asList(bs)); - bs= ClassTypeHelper.findOverriders(getIndex(), m); + bs= ClassTypeHelper.findOverriders(getIndex(), m, node); bindings.addAll(Arrays.asList(bs)); } catch (CoreException e) { status.addError(e.getMessage()); diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/LinkedNamesFinder.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/LinkedNamesFinder.java index 4d8a9999bca..a9ae59e8921 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/LinkedNamesFinder.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/LinkedNamesFinder.java @@ -24,6 +24,7 @@ import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTComment; import org.eclipse.cdt.core.dom.ast.IASTFileLocation; import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorElseStatement; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorEndifStatement; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIfStatement; @@ -58,7 +59,7 @@ public class LinkedNamesFinder { if (target == null) { return EMPTY_LOCATIONS_ARRAY; } - BindingFinder bindingFinder = new BindingFinder(root); + BindingFinder bindingFinder = new BindingFinder(root, name); bindingFinder.find(target); return bindingFinder.getLocations(); } @@ -66,9 +67,11 @@ public class LinkedNamesFinder { private static class BindingFinder { private final IASTTranslationUnit root; private final List locations; + private final IASTNode point; - public BindingFinder(IASTTranslationUnit root) { + public BindingFinder(IASTTranslationUnit root, IASTNode point) { this.root = root; + this.point = point; locations = new ArrayList(); } @@ -122,7 +125,7 @@ public class LinkedNamesFinder { SubclassFinder subclassFinder = new SubclassFinder(ownerClass); root.accept(subclassFinder); - return ClassTypeHelper.findOverriders(subclassFinder.getSubclasses(), method); + return ClassTypeHelper.findOverriders(subclassFinder.getSubclasses(), method, point); } public IRegion[] getLocations() {