/******************************************************************************* * Copyright (c) 2010 György Orosz. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * György Orosz - initial API and implementation ******************************************************************************/ package org.erlide.wrangler.refactoring.backend; import org.eclipse.core.resources.IFile; import org.erlide.runtime.rpc.IOtpRpc; import org.erlide.runtime.rpc.RpcResult; import org.erlide.util.ErlLogger; import org.erlide.wrangler.refactoring.backend.SyntaxInfo.Type; import org.erlide.wrangler.refactoring.util.GlobalParameters; import com.ericsson.otp.erlang.OtpErlangAtom; import com.ericsson.otp.erlang.OtpErlangInt; import com.ericsson.otp.erlang.OtpErlangList; import com.ericsson.otp.erlang.OtpErlangLong; import com.ericsson.otp.erlang.OtpErlangObject; import com.ericsson.otp.erlang.OtpErlangTuple; /** * Wranglers syntax backend, which is for determining about a selection its type * * @author Gyorgy Orosz * @version %I%, %G% */ public class WranglerSyntaxBackend implements IWranglerBackend { protected IOtpRpc backend; protected static final String MODULE = "wrangler_ast_server"; protected static final String INTERFACE_MODULE = "api_interface"; protected static final String PARSE_FUNCTION = "parse_annotate_file"; protected static final String VAR_FUNCTION = "pos_to_var_name"; /** * @param backend * Backend object */ public WranglerSyntaxBackend(final IOtpRpc backend) { this.backend = backend; } protected OtpErlangTuple parseFile(final IFile f) { final String filePath = f.getLocation().toOSString(); final RpcResult res = backend.call_noexception(MODULE, PARSE_FUNCTION, "sax", filePath, "true", GlobalParameters.getWranglerSelection().getSearchPath()); return parseParserResult(res.getValue()); } protected OtpErlangTuple parseParserResult(final OtpErlangObject value) { final OtpErlangTuple backendResult = (OtpErlangTuple) value; if (!((OtpErlangAtom) backendResult.elementAt(0)).atomValue().equals("ok")) { return null; } final OtpErlangTuple wranglerResult = (OtpErlangTuple) backendResult.elementAt(1); return (OtpErlangTuple) wranglerResult.elementAt(0); } protected SyntaxInfo varToPos(final OtpErlangTuple syntaxTree, final int line, final int col) { final OtpErlangInt[] position = new OtpErlangInt[2]; position[0] = new OtpErlangInt(line); position[1] = new OtpErlangInt(col); final RpcResult res = backend.call_noexception(INTERFACE_MODULE, VAR_FUNCTION, "xx", syntaxTree, new OtpErlangTuple(position)); return parseVarInfo(res.getValue()); } private SyntaxInfo parseVarInfo(final OtpErlangObject value) { try { final OtpErlangTuple result = (OtpErlangTuple) value; if (!((OtpErlangAtom) result.elementAt(0)).atomValue().equals("ok")) { return new SyntaxInfo(Type.NONE, -1, -1); } SyntaxInfo ret; final OtpErlangTuple res = (OtpErlangTuple) result.elementAt(1); final OtpErlangTuple position = (OtpErlangTuple) ((OtpErlangList) res .elementAt(1)).elementAt(0); OtpErlangLong line, col; line = (OtpErlangLong) position.elementAt(0); col = (OtpErlangLong) position.elementAt(0); ret = new SyntaxInfo(Type.VARIABLE, line.intValue(), col.intValue()); return ret; } catch (final Exception e) { ErlLogger.debug(e); return null; } } /** * Returns syntax information about a selection * * @param f * selected file * @param line * selected line * @param pos * selected position * @return syntax information */ public SyntaxInfo getSyntaxInfo(final IFile f, final int line, final int pos) { return varToPos(parseFile(f), line, pos); } // TODO:: implement expression checking }