package org.erlide.engine.internal.services.codeassist;
import java.util.Collection;
import java.util.SortedSet;
import java.util.TreeSet;
import org.erlide.engine.services.codeassist.ContextAssistService;
import org.erlide.engine.services.codeassist.RecordCompletion;
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.OtpErlangList;
import com.ericsson.otp.erlang.OtpErlangObject;
import com.ericsson.otp.erlang.OtpErlangRangeException;
import com.ericsson.otp.erlang.OtpErlangTuple;
public class ErlideContextAssist implements ContextAssistService {
private final IOtpRpc backend;
public ErlideContextAssist(final IOtpRpc backend) {
this.backend = backend;
}
@Override
public Collection<String> getVariables(final String src, final String prefix) {
final SortedSet<String> result = new TreeSet<>();
try {
final OtpErlangObject res = backend.call("erlide_content_assist",
"get_variables", "ss", src, prefix);
if (Util.isOk(res)) {
final OtpErlangTuple t = (OtpErlangTuple) res;
final OtpErlangList l = (OtpErlangList) t.elementAt(1);
for (final OtpErlangObject i : l) {
result.add(Util.stringValue(i));
}
}
} catch (final RpcException e) {
ErlLogger.error(e);
}
return result;
}
@Override
public RecordCompletion checkRecordCompletion(final IOtpRpc buildBackend,
final String prefix) {
try {
final OtpErlangObject res = buildBackend.call("erlide_content_assist",
"check_record", "s", prefix);
if (Util.isOk(res)) {
final OtpErlangTuple t = (OtpErlangTuple) res;
final OtpErlangTuple r = (OtpErlangTuple) t.elementAt(1);
return new RecordCompletion(r);
}
} catch (final RpcException e) {
ErlLogger.error(e);
} catch (final OtpErlangRangeException e) {
ErlLogger.error(e);
}
return null;
}
@Override
@SuppressWarnings("boxing")
public OtpErlangList getFunctionHead(final String name, final int arity) {
try {
final OtpErlangObject res = backend.call("erlide_content_assist",
"get_function_head", "ai", name, arity);
if (res instanceof OtpErlangList) {
return (OtpErlangList) res;
}
} catch (final RpcException e) {
ErlLogger.error(e);
}
return null;
}
}