Package org.erlide.engine.services.search

Source Code of org.erlide.engine.services.search.ErlangSearchPattern

package org.erlide.engine.services.search;

import java.util.EnumSet;

import com.ericsson.otp.erlang.OtpErlangAtom;
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;

public abstract class ErlangSearchPattern {

    protected static final OtpErlangAtom EXTERNAL_CALL_ATOM = new OtpErlangAtom(
            "external_call");
    protected static final OtpErlangAtom FUNCTION_CALL_ATOM = new OtpErlangAtom(
            "function_call");
    protected static final OtpErlangAtom FUNCTION_DEF_ATOM = new OtpErlangAtom(
            "function_def");
    protected static final OtpErlangAtom FUNCTION_DEF_MOD_ATOM = new OtpErlangAtom(
            "function_def_mod");
    static final OtpErlangAtom INCLUDE_REF_ATOM = new OtpErlangAtom("include_ref");
    protected static final OtpErlangAtom MACRO_DEF_ATOM = new OtpErlangAtom("macro_def");
    protected static final OtpErlangAtom MACRO_REF_ATOM = new OtpErlangAtom("macro_ref");
    protected static final OtpErlangAtom RECORD_DEF_ATOM = new OtpErlangAtom("record_def");
    protected static final OtpErlangAtom RECORD_REF_ATOM = new OtpErlangAtom("record_ref");
    protected static final OtpErlangAtom TYPE_DEF_ATOM = new OtpErlangAtom("type_def");
    protected static final OtpErlangAtom TYPE_REF_ATOM = new OtpErlangAtom("type_ref");
    protected static final OtpErlangAtom VARIABLE_PATTERN_ATOM = new OtpErlangAtom(
            "var_pattern");
    protected static final OtpErlangAtom VARIABLE_DEF_ATOM = new OtpErlangAtom("var_def");
    protected static final OtpErlangAtom VARIABLE_REF_ATOM = new OtpErlangAtom("var_ref");
    protected static final OtpErlangAtom RECORD_FIELD_DEF_ATOM = new OtpErlangAtom(
            "record_field_def");
    protected static final OtpErlangAtom RECORD_FIELD_REF_ATOM = new OtpErlangAtom(
            "record_field_ref");

    public static EnumSet<SearchFor> allSearchFor = EnumSet.allOf(SearchFor.class);

    public static EnumSet<LimitTo> allLimitTo = EnumSet.allOf(LimitTo.class);

    protected final LimitTo limitTo;

    protected ErlangSearchPattern(final LimitTo limitTo) {
        this.limitTo = limitTo;
    }

    abstract public OtpErlangObject getSearchObject();

    protected OtpErlangObject makeSSPatternObject(final OtpErlangAtom defAtom,
            final OtpErlangAtom refAtom, final String s1, final String s2) {
        OtpErlangObject defs = null, refs = null;
        if (limitTo != LimitTo.REFERENCES) {
            defs = make3Tuple(defAtom, s1, s2);
        }
        if (limitTo != LimitTo.DEFINITIONS) {
            refs = make3Tuple(refAtom, s1, s2);
        }
        return returnRefsAndOrDefs(refs, defs);
    }

    protected static OtpErlangObject makeIncludePatternObject(final String s) {
        return new OtpErlangTuple(new OtpErlangObject[] { INCLUDE_REF_ATOM,
                new OtpErlangString(s) });
    }

    protected OtpErlangObject makeMFAPatternObject(final OtpErlangAtom defAtom,
            final OtpErlangAtom refAtom, final String m, final String f, final int a,
            final boolean matchAnyFunctionDefinition) {
        OtpErlangObject refs = null, defs = null;
        if (limitTo != LimitTo.REFERENCES) {
            if (matchAnyFunctionDefinition) {
                defs = make3Tuple(defAtom, f, a);
            } else {
                defs = make4Tuple(defAtom, m, f, a);
            }
        }
        if (limitTo != LimitTo.DEFINITIONS) {
            refs = make4Tuple(refAtom, m, f, a);
        }
        return returnRefsAndOrDefs(refs, defs);
    }

    protected OtpErlangObject makeFAPatternObject(final OtpErlangAtom defAtom,
            final OtpErlangAtom refAtom, final String f, final int a) {
        OtpErlangObject refs = null, defs = null;
        if (limitTo != LimitTo.REFERENCES) {
            defs = make3Tuple(defAtom, f, a);
        }
        if (limitTo != LimitTo.DEFINITIONS) {
            refs = make3Tuple(refAtom, f, a);
        }
        return returnRefsAndOrDefs(refs, defs);
    }

    protected OtpErlangObject makeSPatternObject(final OtpErlangAtom defAtom,
            final OtpErlangAtom refAtom, final String s) {
        return makeSPatternObject(defAtom, refAtom, s, s);
    }

    protected OtpErlangObject makeSPatternObject(final OtpErlangAtom defAtom,
            final OtpErlangAtom refAtom, final String defS, final String refS) {
        OtpErlangObject defs = null, refs = null;
        if (limitTo != LimitTo.REFERENCES) {
            defs = make2Tuple(defAtom, defS);
        }
        if (limitTo != LimitTo.DEFINITIONS) {
            refs = make2Tuple(refAtom, refS);
        }
        return returnRefsAndOrDefs(refs, defs);
    }

    private OtpErlangObject returnRefsAndOrDefs(final OtpErlangObject refs,
            final OtpErlangObject defs) {
        if (limitTo == LimitTo.ALL_OCCURRENCES) {
            return new OtpErlangList(new OtpErlangObject[] { refs, defs });
        } else if (limitTo == LimitTo.REFERENCES) {
            return new OtpErlangList(new OtpErlangObject[] { refs });
        } else {
            return new OtpErlangList(new OtpErlangObject[] { defs });
        }
    }

    private static OtpErlangTuple make2Tuple(final OtpErlangAtom atom, final String s) {
        return new OtpErlangTuple(new OtpErlangObject[] { atom, new OtpErlangAtom(s) });
    }

    private static final OtpErlangAtom UNDEFINED = new OtpErlangAtom("undefined");

    private static OtpErlangObject make3Tuple(final OtpErlangAtom atom, final String s,
            final int a) {
        if (a >= 0) {
            return new OtpErlangTuple(new OtpErlangObject[] { atom, new OtpErlangAtom(s),
                    new OtpErlangLong(a) });
        }
        return new OtpErlangTuple(new OtpErlangObject[] { atom, new OtpErlangAtom(s),
                UNDEFINED });

    }

    private static OtpErlangObject make3Tuple(final OtpErlangAtom atom, final String a1,
            final String a2) {
        return new OtpErlangTuple(new OtpErlangObject[] { atom, new OtpErlangAtom(a1),
                new OtpErlangAtom(a2) });
    }

    private static OtpErlangObject make4Tuple(final OtpErlangAtom atom, final String s1,
            final String s2, final int a) {
        if (a >= 0) {
            return new OtpErlangTuple(new OtpErlangObject[] { atom,
                    new OtpErlangAtom(s1), new OtpErlangAtom(s2), new OtpErlangLong(a) });
        }
        return new OtpErlangTuple(new OtpErlangObject[] { atom, new OtpErlangAtom(s1),
                new OtpErlangAtom(s2), UNDEFINED });
    }

    public LimitTo getLimitTo() {
        return limitTo;
    }

    public abstract String patternString();

    public abstract SearchFor getSearchFor();

    public abstract String labelString();

    public ErlSearchScope reduceScope(final ErlSearchScope scope) {
        return scope;
    }

}
TOP

Related Classes of org.erlide.engine.services.search.ErlangSearchPattern

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.