package org.erlide.engine.services.search; import org.erlide.engine.model.root.IErlModule; import com.ericsson.otp.erlang.OtpErlangAtom; import com.ericsson.otp.erlang.OtpErlangObject; public class FunctionPattern extends ErlangSearchPattern { private final String moduleName; private final String name; private final int arity; private final boolean matchAnyFunctionDefinition; private final boolean local; private final IErlModule module; public FunctionPattern(final String moduleName, final String name, final int arity, final LimitTo limitTo, final boolean matchAnyFunctionDefinition, final IErlModule module, final boolean local) { super(limitTo); this.moduleName = moduleName; this.name = name; this.arity = arity; this.matchAnyFunctionDefinition = matchAnyFunctionDefinition; this.module = module; this.local = local; } @Override public OtpErlangObject getSearchObject() { if (moduleName == null || moduleName.length() == 0) { return makeFAPatternObject(FUNCTION_DEF_ATOM, FUNCTION_CALL_ATOM, name, arity); } final OtpErlangAtom defA = matchAnyFunctionDefinition ? FUNCTION_DEF_ATOM : FUNCTION_DEF_MOD_ATOM; return makeMFAPatternObject(defA, EXTERNAL_CALL_ATOM, moduleName, name, arity, matchAnyFunctionDefinition); } @Override public String patternString() { final String s = name + "/" + arity; if (moduleName == null || limitTo != LimitTo.REFERENCES) { return s; } return moduleName + ":" + s; } @Override public SearchFor getSearchFor() { return SearchFor.FUNCTION; } @Override public String labelString() { final String s = name + "/" + arity; if (moduleName == null || limitTo != LimitTo.REFERENCES) { return s; } return moduleName + ":" + s; } @Override public ErlSearchScope reduceScope(final ErlSearchScope scope) { if (local && scope.getModules().contains(module)) { return new ErlSearchScope(module); } return scope; } }