blob: a776a8d5430fe16b97f920ffcd359d5b4e85c3b2 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2018, 2019 1C-Soft LLC.
*
* This program and the accompanying materials are made available under
* the terms of the Eclipse Public License 2.0 which is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Vladimir Piskarev (1C) - initial API and implementation
*******************************************************************************/
package org.eclipse.handly.internal.examples.adapter.ui.callhierarchy;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.handly.internal.examples.adapter.ui.Activator;
import org.eclipse.handly.snapshot.Snapshot;
import org.eclipse.handly.ui.callhierarchy.CallHierarchyKind;
import org.eclipse.handly.ui.callhierarchy.CallHierarchyNode;
import org.eclipse.handly.ui.callhierarchy.CallLocation;
import org.eclipse.handly.ui.callhierarchy.ICallHierarchyNode;
import org.eclipse.handly.ui.callhierarchy.ICallLocation;
import org.eclipse.handly.util.TextRange;
import org.eclipse.jdt.core.IBuffer;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.search.IJavaSearchConstants;
import org.eclipse.jdt.core.search.SearchEngine;
import org.eclipse.jdt.core.search.SearchMatch;
import org.eclipse.jdt.core.search.SearchParticipant;
import org.eclipse.jdt.core.search.SearchPattern;
import org.eclipse.jdt.core.search.SearchRequestor;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.Document;
final class JavaCallerHierarchyNode
extends CallHierarchyNode
{
private static final JavaCallerHierarchyNode[] EMPTY_ARRAY =
new JavaCallerHierarchyNode[0];
static JavaCallerHierarchyNode newRootNode(IMethod method)
{
return new JavaCallerHierarchyNode(null, method);
}
private JavaCallerHierarchyNode(ICallHierarchyNode parent, IMethod method)
{
super(parent, method);
}
IMethod getMethod()
{
return (IMethod)getElement();
}
@Override
public CallHierarchyKind getKind()
{
return CallHierarchyKind.CALLER;
}
@Override
protected ICallHierarchyNode[] computeChildren(IProgressMonitor monitor)
{
Map<IMethod, JavaCallerHierarchyNode> callerNodes = new HashMap<>();
SearchEngine engine = new SearchEngine();
SearchPattern pattern = SearchPattern.createPattern(getMethod(),
IJavaSearchConstants.REFERENCES);
if (pattern == null)
return EMPTY_ARRAY;
SearchRequestor requestor = new SearchRequestor()
{
@Override
public void acceptSearchMatch(SearchMatch match)
throws CoreException
{
if (match.getAccuracy() != SearchMatch.A_ACCURATE
|| match.isInsideDocComment())
return;
Object element = match.getElement();
if (!(element instanceof IMethod))
return;
IMethod caller = (IMethod)element;
IMethod callee = getMethod();
JavaCallerHierarchyNode callerNode = callerNodes.get(caller);
if (callerNode == null)
{
callerNode = new JavaCallerHierarchyNode(
JavaCallerHierarchyNode.this, caller);
callerNodes.put(caller, callerNode);
}
String callText = "";
TextRange callRange = null;
int lineNumber = ICallLocation.UNKOWN_LINE_NUMBER;
Snapshot snapshot = null;
int offset = match.getOffset();
int length = match.getLength();
if (offset >= 0 && length >= 0)
{
callRange = new TextRange(offset, length);
IBuffer buffer = caller.getOpenable().getBuffer();
if (buffer != null)
{
try
{
callText = buffer.getText(offset, length);
}
catch (IndexOutOfBoundsException e)
{
// buffer is out of sync, ignore
}
String contents = buffer.getContents();
Document document = new Document(contents);
try
{
lineNumber = document.getLineOfOffset(offset);
}
catch (BadLocationException e)
{
// buffer is out of sync, ignore
}
snapshot = new Snapshot()
{
@Override
public String getContents()
{
return contents;
}
};
}
}
callerNode.addCallLocation(new CallLocation(caller, callee,
callText, callRange, lineNumber, snapshot));
}
};
try
{
engine.search(pattern, new SearchParticipant[] {
SearchEngine.getDefaultSearchParticipant() },
SearchEngine.createWorkspaceScope(), requestor, monitor);
}
catch (CoreException e)
{
Activator.logError(e);
}
return callerNodes.values().toArray(EMPTY_ARRAY);
}
}