package org.erlide.engine.internal.services.search;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.erlide.runtime.rpc.IOtpRpc;
import org.erlide.runtime.rpc.RpcException;
import org.erlide.util.ErlLogger;
import org.erlide.util.Util;
import com.ericsson.otp.erlang.OtpErlangAtom;
import com.ericsson.otp.erlang.OtpErlangList;
import com.ericsson.otp.erlang.OtpErlangObject;
import com.ericsson.otp.erlang.OtpErlangTuple;
public class ErlideXref {
private static final String ERLIDE_XREF = "erlide_xref";
public static void addDirs(final IOtpRpc backend, final Collection<String> dirs) {
try {
backend.call(ERLIDE_XREF, "add_dirs", "ls", dirs);
} catch (final RpcException e) {
ErlLogger.warn(e);
}
}
public static List<String> modules(final IOtpRpc backend) {
final ArrayList<String> result = new ArrayList<>();
try {
final OtpErlangObject res = backend.call(ERLIDE_XREF, "modules", "");
if (Util.isOk(res)) {
final OtpErlangTuple t = (OtpErlangTuple) res;
final OtpErlangList l = (OtpErlangList) t.elementAt(1);
for (final OtpErlangObject i : l) {
if (i instanceof OtpErlangAtom) {
final OtpErlangAtom m = (OtpErlangAtom) i;
result.add(m.atomValue());
}
}
}
} catch (final RpcException e) {
ErlLogger.error(e);
}
return result;
}
public static void setScope(final IOtpRpc backend, final List<String> scope) {
final List<String> mods = modules(backend);
removeModules(backend, mods);
addDirs(backend, scope);
}
private static void removeModules(final IOtpRpc backend, final List<String> mods) {
try {
backend.call(ERLIDE_XREF, "remove_modules", "ls", mods);
} catch (final RpcException e) {
ErlLogger.error(e);
}
}
}