package org.erlide.engine.internal.services.text; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.erlide.engine.services.text.IndentResult; import org.erlide.engine.services.text.IndentService; import org.erlide.runtime.rpc.IOtpRpc; import org.erlide.runtime.rpc.RpcException; import com.ericsson.otp.erlang.OtpErlangAtom; import com.ericsson.otp.erlang.OtpErlangLong; import com.ericsson.otp.erlang.OtpErlangObject; import com.ericsson.otp.erlang.OtpErlangRangeException; import com.ericsson.otp.erlang.OtpErlangTuple; public class ErlideIndent implements IndentService { private final IOtpRpc backend; public ErlideIndent(final IOtpRpc backend) { this.backend = backend; } private List<OtpErlangTuple> fixIndentPrefs(final Map<String, String> m) { final List<OtpErlangTuple> result = new ArrayList<>(m.size()); for (final Map.Entry<String, String> e : m.entrySet()) { final OtpErlangAtom a = new OtpErlangAtom(e.getKey()); final String s = e.getValue(); int n; if ("false".equals(s)) { n = 0; } else if ("true".equals(s)) { n = 1; } else { n = Integer.parseInt(s); } final OtpErlangLong l = new OtpErlangLong(n); final OtpErlangTuple t = new OtpErlangTuple(new OtpErlangObject[] { a, l }); result.add(t); } return result; } @Override @SuppressWarnings("boxing") public IndentResult indentLine(final String oldLine, final String txt, final String insertedText, final int indentw, final int tabw, final boolean useTabs, final Map<String, String> prefs) throws RpcException, OtpErlangRangeException { // ErlLogger.debug("indentLine '%s'", txt); final OtpErlangObject o = backend.call("erlide_indent", "indent_line", "sssiiox", txt, oldLine, insertedText, indentw, tabw, useTabs, fixIndentPrefs(prefs)); return new IndentResult(o); } @Override @SuppressWarnings("boxing") public OtpErlangObject indentLines(final int offset, final int length, final String text, final int indentw, final int tabw, final boolean useTabs, final Map<String, String> prefs) throws RpcException { final OtpErlangObject o = backend.call(40000, "erlide_indent", "indent_lines", "siiiiolx", text, offset, length, indentw, tabw, useTabs, fixIndentPrefs(prefs)); return o; } @Override public OtpErlangObject templateIndentLines(final String prefix, final String text, final int indentw, final int tabw, final boolean useTabs, final Map<String, String> prefs) throws RpcException { final OtpErlangObject o = backend.call(20000, "erlide_indent", "template_indent_lines", "ssiiolx", prefix, text, indentw, tabw, useTabs, fixIndentPrefs(prefs)); return o; } }