/******************************************************************************* * 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.duplicatedcode.core; import java.util.ArrayList; import java.util.Iterator; import org.eclipse.core.resources.IFile; import org.erlide.wrangler.refactoring.duplicatedcode.ui.elements.DuplicatedCodeElement; import org.erlide.wrangler.refactoring.duplicatedcode.ui.elements.DuplicatedCodeInstanceElement; import org.erlide.wrangler.refactoring.selection.IErlSelection; import org.erlide.wrangler.refactoring.util.GlobalParameters; import com.ericsson.otp.erlang.OtpErlangList; import com.ericsson.otp.erlang.OtpErlangLong; import com.ericsson.otp.erlang.OtpErlangObject; import com.ericsson.otp.erlang.OtpErlangString; import com.ericsson.otp.erlang.OtpErlangTuple; /** * Parser class for expression search refactoring * * @author Gyorgy Orosz * */ public class ExpressionSearchParser extends AbstractDuplicatesParser { /** * Constructor * * @param obj * object to be parsed */ public ExpressionSearchParser(final OtpErlangObject obj) { super(obj); } @Override public void parse(final OtpErlangObject object) { try { final OtpErlangTuple res = (OtpErlangTuple) object; if (!res.elementAt(0).toString().equals("ok")) { setUnSuccessful(((OtpErlangString) res.elementAt(1)).stringValue()); return; } if (res.elementAt(1).equals(new OtpErlangList())) { setUnSuccessful("No more instances found!"); return; } final OtpErlangList posList = (OtpErlangList) res.elementAt(1); OtpErlangTuple actPos; OtpErlangLong startLine, startColumn, endLine, endColumn; final ArrayList<DuplicatedCodeInstanceElement> instances = new ArrayList<>(); final Iterator<OtpErlangObject> it = posList.iterator(); while (it.hasNext()) { actPos = (OtpErlangTuple) it.next(); startLine = (OtpErlangLong) ((OtpErlangTuple) actPos.elementAt(0)) .elementAt(0); startColumn = (OtpErlangLong) ((OtpErlangTuple) actPos.elementAt(0)) .elementAt(1); endLine = (OtpErlangLong) ((OtpErlangTuple) actPos.elementAt(1)) .elementAt(0); endColumn = (OtpErlangLong) ((OtpErlangTuple) actPos.elementAt(1)) .elementAt(1); final IErlSelection sel = GlobalParameters.getWranglerSelection(); instances.add(new DuplicatedCodeInstanceElement( (IFile) sel.getErlElement().getResource(), startLine.intValue(), startColumn.intValue(), endLine.intValue(), endColumn.intValue() + 1)); } final DuplicatedCodeInstanceElement defaultInstance = instances.get(0); final DuplicatedCodeElement result = new DuplicatedCodeElement( defaultInstance); for (final DuplicatedCodeInstanceElement instance : instances) { result.addChild(instance); } isSuccessful = true; errorMessage = null; duplicates = new ArrayList<>(); duplicates.add(result); } catch (final Exception e) { setUnSuccessful(e.getMessage()); } } }