package org.erlide.cover.views.model; import java.util.Collections; import java.util.LinkedList; import java.util.List; import org.erlide.engine.ErlangEngine; import org.erlide.engine.model.ErlModelException; import org.erlide.engine.model.erlang.ErlangFunction; import org.erlide.engine.model.erlang.IErlFunction; import org.erlide.engine.model.root.IErlModule; import org.erlide.util.ErlLogger; /** * Coverage statistics per function. * * @author Aleksandra Lipiec <aleksandra.lipiec@erlang.solutions.com> * */ public class FunctionStats extends StatsTreeObject { private static final long serialVersionUID = 1L; private int arity; // function arity private int lineStart; // first line of the function private int lineEnd; // last line of the function public FunctionStats() { super(ObjectType.FUNCTION); } public int getArity() { return arity; } public void setArity(final int arity) { this.arity = arity; } /** * First line of the function * * @return */ public int getLineStart() { if (lineStart != 0) { return lineStart; } final String mName = ((StatsTreeObject) getParent()).getLabel(); IErlModule m; try { m = ErlangEngine.getInstance().getModel().findModule(mName); final IErlFunction f = m .findFunction(new ErlangFunction(getLabel(), getArity())); lineStart = f.getLineStart(); } catch (final ErlModelException e) { ErlLogger.error(e); } return lineStart; } /** * Last line of the function * * @return */ public int getLineEnd() { if (lineEnd != 0) { return lineEnd; } final List<Integer> numList = new LinkedList<>(); for (final ICoverageObject obj : getParent().getChildren()) { final FunctionStats fs = (FunctionStats) obj; numList.add(fs.getLineStart()); } Collections.sort(numList); int idx; if ((idx = numList.indexOf(getLineStart())) < numList.size() - 1) { lineEnd = numList.get(idx + 1); } else { lineEnd = -1; } return lineEnd; } }