blob: b6c75853fcc3231ad3d109b8684a2b3b15f321f7 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2019 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Jesper Kamstrup Linnet (eclipse@kamstrup-linnet.dk) - initial API and implementation
* (report 36180: Callers/Callees view)
* Red Hat Inc. - refactored to jdt.core.manipulation
*******************************************************************************/
package org.eclipse.jdt.internal.corext.callhierarchy;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.core.IMember;
import org.eclipse.jdt.core.dom.CompilationUnit;
class CalleeMethodWrapper extends MethodWrapper {
private Comparator<MethodWrapper> fMethodWrapperComparator = new MethodWrapperComparator();
private static class MethodWrapperComparator implements Comparator<MethodWrapper> {
@Override
public int compare(MethodWrapper m1, MethodWrapper m2) {
CallLocation callLocation1 = m1.getMethodCall().getFirstCallLocation();
CallLocation callLocation2 = m2.getMethodCall().getFirstCallLocation();
if ((callLocation1 != null) && (callLocation2 != null)) {
if (callLocation1.getStart() == callLocation2.getStart()) {
return callLocation1.getEnd() - callLocation2.getEnd();
}
return callLocation1.getStart() - callLocation2.getStart();
}
return 0;
}
}
public CalleeMethodWrapper(MethodWrapper parent, MethodCall methodCall) {
super(parent, methodCall);
}
/* Returns the calls sorted after the call location
* @see org.eclipse.jdt.internal.corext.callhierarchy.MethodWrapper#getCalls()
*/
@Override
public MethodWrapper[] getCalls(IProgressMonitor progressMonitor) {
MethodWrapper[] result = super.getCalls(progressMonitor);
Arrays.sort(result, fMethodWrapperComparator);
return result;
}
@Override
protected String getTaskName() {
return CallHierarchyMessages.CalleeMethodWrapper_taskname;
}
/*
* @see org.eclipse.jdt.internal.corext.callhierarchy.MethodWrapper#createMethodWrapper(org.eclipse.jdt.internal.corext.callhierarchy.MethodCall)
*/
@Override
protected MethodWrapper createMethodWrapper(MethodCall methodCall) {
return new CalleeMethodWrapper(this, methodCall);
}
/*
* @see org.eclipse.jdt.internal.corext.callhierarchy.MethodWrapper#canHaveChildren()
*/
@Override
public boolean canHaveChildren() {
return true;
}
/**
* Find callees called from the current method.
* @see org.eclipse.jdt.internal.corext.callhierarchy.MethodWrapper#findChildren(org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
protected Map<String, MethodCall> findChildren(IProgressMonitor progressMonitor) {
IMember member= getMember();
if (member.exists()) {
CompilationUnit cu= CallHierarchyCore.getCompilationUnitNode(member, true);
if (progressMonitor != null) {
progressMonitor.worked(5);
}
if (cu != null) {
CalleeAnalyzerVisitor visitor = new CalleeAnalyzerVisitor(member, cu, progressMonitor);
cu.accept(visitor);
return visitor.getCallees();
}
}
return new HashMap<>(0);
}
}