mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-01 21:35:40 +02:00
Bug 509833 - Fix unsafe method call in ClassTypeHelper.findOverriders()
Change-Id: I3368d7dd22ce8e207f6363509b6830099a8f0236
This commit is contained in:
parent
6132605f03
commit
aa0d656ab7
4 changed files with 14 additions and 9 deletions
|
@ -839,7 +839,8 @@ public class ClassTypeHelper {
|
||||||
/**
|
/**
|
||||||
* Returns all methods found in the index, that override the given {@code method}.
|
* 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))
|
if (!isVirtual(method))
|
||||||
return ICPPMethod.EMPTY_CPPMETHOD_ARRAY;
|
return ICPPMethod.EMPTY_CPPMETHOD_ARRAY;
|
||||||
|
|
||||||
|
@ -848,18 +849,18 @@ public class ClassTypeHelper {
|
||||||
return ICPPMethod.EMPTY_CPPMETHOD_ARRAY;
|
return ICPPMethod.EMPTY_CPPMETHOD_ARRAY;
|
||||||
|
|
||||||
ICPPClassType[] subclasses= getSubClasses(index, mcl);
|
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}.
|
* 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 char[] mname= method.getNameCharArray();
|
||||||
final ICPPFunctionType mft= method.getType();
|
final ICPPFunctionType mft= method.getType();
|
||||||
final ArrayList<ICPPMethod> result= new ArrayList<>();
|
final ArrayList<ICPPMethod> result= new ArrayList<>();
|
||||||
for (ICPPClassType subClass : subclasses) {
|
for (ICPPClassType subClass : subclasses) {
|
||||||
ICPPMethod[] methods= subClass.getDeclaredMethods();
|
ICPPMethod[] methods= ClassTypeHelper.getDeclaredMethods(subClass, point);
|
||||||
for (ICPPMethod candidate : methods) {
|
for (ICPPMethod candidate : methods) {
|
||||||
if (CharArrayUtils.equals(mname, candidate.getNameCharArray()) &&
|
if (CharArrayUtils.equals(mname, candidate.getNameCharArray()) &&
|
||||||
functionTypesAllowOverride(mft, candidate.getType())) {
|
functionTypesAllowOverride(mft, candidate.getType())) {
|
||||||
|
|
|
@ -177,7 +177,7 @@ public class CHQueries {
|
||||||
* if there are none.
|
* if there are none.
|
||||||
*/
|
*/
|
||||||
static ICElement[] findOverriders(IIndex index, ICPPMethod binding) throws CoreException {
|
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) {
|
if (virtualOverriders.length > 0) {
|
||||||
ArrayList<ICElementHandle> list= new ArrayList<ICElementHandle>();
|
ArrayList<ICElementHandle> list= new ArrayList<ICElementHandle>();
|
||||||
list.addAll(Arrays.asList(IndexUI.findRepresentative(index, binding)));
|
list.addAll(Arrays.asList(IndexUI.findRepresentative(index, binding)));
|
||||||
|
|
|
@ -100,6 +100,7 @@ public class CRenameMethodProcessor extends CRenameGlobalProcessor {
|
||||||
|
|
||||||
CRefactoringArgument argument= getArgument();
|
CRefactoringArgument argument= getArgument();
|
||||||
IBinding binding= argument.getBinding();
|
IBinding binding= argument.getBinding();
|
||||||
|
IASTNode node= ASTInternal.getPhysicalNodeOfScope(argument.getScope());
|
||||||
ArrayList<IBinding> bindings= new ArrayList<>();
|
ArrayList<IBinding> bindings= new ArrayList<>();
|
||||||
if (binding != null) {
|
if (binding != null) {
|
||||||
recordRename(binding);
|
recordRename(binding);
|
||||||
|
@ -110,7 +111,7 @@ public class CRenameMethodProcessor extends CRenameGlobalProcessor {
|
||||||
try {
|
try {
|
||||||
IBinding[] bs= ClassTypeHelper.findOverridden(m, argument.getTranslationUnit());
|
IBinding[] bs= ClassTypeHelper.findOverridden(m, argument.getTranslationUnit());
|
||||||
bindings.addAll(Arrays.asList(bs));
|
bindings.addAll(Arrays.asList(bs));
|
||||||
bs= ClassTypeHelper.findOverriders(getIndex(), m);
|
bs= ClassTypeHelper.findOverriders(getIndex(), m, node);
|
||||||
bindings.addAll(Arrays.asList(bs));
|
bindings.addAll(Arrays.asList(bs));
|
||||||
} catch (CoreException e) {
|
} catch (CoreException e) {
|
||||||
status.addError(e.getMessage());
|
status.addError(e.getMessage());
|
||||||
|
|
|
@ -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.IASTComment;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
|
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTName;
|
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.IASTPreprocessorElseStatement;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorEndifStatement;
|
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorEndifStatement;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIfStatement;
|
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIfStatement;
|
||||||
|
@ -58,7 +59,7 @@ public class LinkedNamesFinder {
|
||||||
if (target == null) {
|
if (target == null) {
|
||||||
return EMPTY_LOCATIONS_ARRAY;
|
return EMPTY_LOCATIONS_ARRAY;
|
||||||
}
|
}
|
||||||
BindingFinder bindingFinder = new BindingFinder(root);
|
BindingFinder bindingFinder = new BindingFinder(root, name);
|
||||||
bindingFinder.find(target);
|
bindingFinder.find(target);
|
||||||
return bindingFinder.getLocations();
|
return bindingFinder.getLocations();
|
||||||
}
|
}
|
||||||
|
@ -66,9 +67,11 @@ public class LinkedNamesFinder {
|
||||||
private static class BindingFinder {
|
private static class BindingFinder {
|
||||||
private final IASTTranslationUnit root;
|
private final IASTTranslationUnit root;
|
||||||
private final List<IRegion> locations;
|
private final List<IRegion> locations;
|
||||||
|
private final IASTNode point;
|
||||||
|
|
||||||
public BindingFinder(IASTTranslationUnit root) {
|
public BindingFinder(IASTTranslationUnit root, IASTNode point) {
|
||||||
this.root = root;
|
this.root = root;
|
||||||
|
this.point = point;
|
||||||
locations = new ArrayList<IRegion>();
|
locations = new ArrayList<IRegion>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -122,7 +125,7 @@ public class LinkedNamesFinder {
|
||||||
|
|
||||||
SubclassFinder subclassFinder = new SubclassFinder(ownerClass);
|
SubclassFinder subclassFinder = new SubclassFinder(ownerClass);
|
||||||
root.accept(subclassFinder);
|
root.accept(subclassFinder);
|
||||||
return ClassTypeHelper.findOverriders(subclassFinder.getSubclasses(), method);
|
return ClassTypeHelper.findOverriders(subclassFinder.getSubclasses(), method, point);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IRegion[] getLocations() {
|
public IRegion[] getLocations() {
|
||||||
|
|
Loading…
Add table
Reference in a new issue