package org.erlide.engine.internal.services.search;
import java.util.Collection;
import java.util.List;
import org.erlide.engine.ErlangEngine;
import org.erlide.engine.services.search.OpenService;
import org.erlide.engine.services.search.OtpDocService;
import org.erlide.runtime.rpc.IOtpRpc;
import org.erlide.runtime.rpc.RpcException;
import org.erlide.util.ErlLogger;
import org.erlide.util.ErlangFunctionCall;
import com.ericsson.otp.erlang.OtpErlangAtom;
import com.ericsson.otp.erlang.OtpErlangInt;
import com.ericsson.otp.erlang.OtpErlangList;
import com.ericsson.otp.erlang.OtpErlangObject;
import com.ericsson.otp.erlang.OtpErlangString;
import com.ericsson.otp.erlang.OtpErlangTuple;
public class ErlideDoc implements OtpDocService {
private static final String ERLIDE_OTP_DOC = "erlide_otp_doc";
private final IOtpRpc backend;
private final String stateDir;
public ErlideDoc(final IOtpRpc backend, final String stateDir) {
this.backend = backend;
this.stateDir = stateDir;
}
@Override
public OtpErlangObject getProposalsWithDoc(final IOtpRpc b, final String mod,
final String prefix) {
OtpErlangObject res = null;
try {
res = b.call(ERLIDE_OTP_DOC, "get_proposals", "ass", mod, prefix, stateDir);
} catch (final RpcException e) {
ErlLogger.warn(e);
}
return res;
}
@Override
public OtpErlangObject getModules(final IOtpRpc b, final String prefix,
final List<String> projectModules, final boolean includes) {
OtpErlangObject res = null;
try {
final String what = includes ? "includes" : "modules";
res = b.call(ERLIDE_OTP_DOC, "get_modules", "slsa", prefix, projectModules,
what);
} catch (final RpcException e) {
ErlLogger.warn(e);
}
return res;
}
@Override
public OtpErlangObject getOtpDoc(final IOtpRpc b,
final ErlangFunctionCall functionCall) {
OtpErlangObject res = null;
final OtpErlangTuple input = new OtpErlangTuple(new OtpErlangObject[] {
new OtpErlangAtom("external"),
new OtpErlangAtom(functionCall.getModule()),
new OtpErlangAtom(functionCall.getName()),
new OtpErlangInt(functionCall.getArity()), new OtpErlangString("") });
try {
res = b.call(ERLIDE_OTP_DOC, "get_doc", "sxs", functionCall.getModule(),
input, stateDir);
} catch (final RpcException e) {
ErlLogger.warn(e);
}
return res;
}
@Override
@SuppressWarnings("boxing")
public OtpErlangObject getOtpDoc(final IOtpRpc b, final int offset,
final String module, final Collection<OtpErlangObject> imports,
final String externalModules, final OtpErlangList pathVars) {
OtpErlangObject res = null;
try {
final OtpErlangObject input = backend.call("erlide_open", "open", "aix",
module, offset,
ErlangEngine.getInstance().getService(OpenService.class)
.mkContext(externalModules, null, pathVars, null, imports));
res = b.call(ERLIDE_OTP_DOC, "get_doc", "sxs", module, input, stateDir);
} catch (final RpcException e) {
ErlLogger.warn(e);
}
return res;
}
@Override
public String getOtpDocLocation(final IOtpRpc b) {
// OtpErlangObject res = null;
// try {
// // commented out since target doesn't exist
// // res = b.rpcx("erlide_otp_doc", "get_otp_doc_location", "");
// // return CoreUtil.stringValue(res);
// } catch (final RpcException e) {
// ErlLogger.warn(e);
// } catch (final BackendException e) {
// ErlLogger.warn(e);
// }
return "";
}
}