package org.erlide.engine.services.search; import org.erlide.engine.model.IErlElement; import org.erlide.engine.model.erlang.IErlAttribute; import org.erlide.engine.model.erlang.IErlFunction; import org.erlide.engine.model.erlang.IErlFunctionClause; import org.erlide.engine.model.erlang.IErlMacroDef; import org.erlide.engine.model.erlang.IErlRecordDef; import org.erlide.engine.model.root.IErlModule; import org.erlide.util.StringUtils; import org.erlide.util.SystemConfiguration; import org.erlide.util.Util; public class SearchPatternFactory { private final ModelUtilService modelUtilService; public SearchPatternFactory(final ModelUtilService modelUtilService) { this.modelUtilService = modelUtilService; } public ErlangSearchPattern getSearchPattern(final SearchFor searchFor, final String moduleName, final String name, final int arity, final LimitTo limitTo, final IErlModule module) { switch (searchFor) { case FUNCTION: return new FunctionPattern(moduleName, name, arity, limitTo, true, null, false); case INCLUDE: return new IncludePattern(name, limitTo); case MACRO: return new MacroPattern(name, limitTo); case RECORD: return new RecordPattern(name, limitTo); case TYPE: return new TypeRefPattern(moduleName, name, limitTo); case RECORD_FIELD: return new RecordFieldPattern(name, limitTo); case VARIABLE: return new VariablePattern("", -1, "", name, limitTo, module); } return null; } public ErlangSearchPattern getSearchPatternFromErlElementAndLimitTo( final IErlElement element, final LimitTo limitTo) { if (element instanceof IErlFunction) { final IErlFunction function = (IErlFunction) element; final String withoutExtension = SystemConfiguration .withoutExtension(function.getModuleName()); return new FunctionPattern(withoutExtension, function.getFunctionName(), function.getArity(), limitTo, true, modelUtilService.getModule(function), !function.isExported()); } else if (element instanceof IErlMacroDef) { final IErlMacroDef m = (IErlMacroDef) element; final String unquoted = StringUtils.unquote(m.getDefinedName()); return new MacroPattern(unquoted, limitTo); } else if (element instanceof IErlRecordDef) { final IErlRecordDef r = (IErlRecordDef) element; final String unquoted = StringUtils.unquote(r.getDefinedName()); return new RecordPattern(unquoted, limitTo); } else if (element instanceof IErlFunctionClause) { final IErlFunctionClause clause = (IErlFunctionClause) element; return getSearchPatternFromErlElementAndLimitTo( (IErlElement) clause.getParent(), limitTo); } else if (element instanceof IErlAttribute) { final IErlAttribute a = (IErlAttribute) element; if (a.getName().startsWith("include")) { final String s = Util.stringValue(a.getValue()); return new IncludePattern(s, limitTo); } } return null; } }