package org.erlide.engine.internal.services.search;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.IPath;
import org.erlide.engine.model.erlang.FunctionRef;
import org.erlide.engine.model.root.IErlProject;
import org.erlide.engine.services.search.XrefService;
import org.erlide.runtime.rpc.IOtpRpc;
import org.erlide.runtime.rpc.RpcFuture;
import org.erlide.util.ErlLogger;
import org.erlide.util.erlang.OtpBindings;
import org.erlide.util.erlang.OtpErlang;
import com.ericsson.otp.erlang.OtpErlangList;
import com.ericsson.otp.erlang.OtpErlangObject;
public class ErlangXref implements XrefService {
private static final String ERLIDE_XREF = "erlide_xref";
private final IOtpRpc backend;
public ErlangXref(final IOtpRpc backend) {
this.backend = backend;
}
@Override
public void start() {
try {
backend.call(ERLIDE_XREF, "start", "");
} catch (final Exception e) {
ErlLogger.debug(e);
}
}
@Override
public void stop() {
try {
backend.call(ERLIDE_XREF, "stop", "");
} catch (final Exception e) {
ErlLogger.debug(e);
}
}
@Override
public RpcFuture addProject(final IErlProject project) {
try {
final IPath outputLocation = project.getWorkspaceProject()
.getFolder(project.getProperties().getOutputDir()).getLocation();
final String loc = outputLocation.toString();
return backend.async_call(ERLIDE_XREF, "add_project", "s", loc);
} catch (final Exception e) {
ErlLogger.debug(e);
}
return null;
}
@Override
public void update() {
try {
backend.call(ERLIDE_XREF, "update", "");
} catch (final Exception e) {
ErlLogger.debug(e);
}
}
@Override
@SuppressWarnings("boxing")
public FunctionRef[] functionUse(final String mod, final String fun,
final int arity) {
try {
final OtpErlangObject r = backend.call(ERLIDE_XREF, "function_use", "aai",
mod, fun, arity);
final OtpBindings bind = OtpErlang.match("{ok, L}", r);
if (bind == null) {
return new FunctionRef[0];
}
final OtpErlangList l = (OtpErlangList) bind.get("L");
final List<FunctionRef> result = new ArrayList<>();
for (final OtpErlangObject e : l) {
result.add(new FunctionRef(e));
}
return result.toArray(new FunctionRef[result.size()]);
} catch (final Exception e) {
ErlLogger.debug(e);
}
return null;
}
@Override
public FunctionRef[] functionUse(final FunctionRef ref) {
return functionUse(ref.module, ref.function, ref.arity);
}
}