/*******************************************************************************
* Copyright (c) 2007, 2008 Edgar Espina.
* 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
*
*******************************************************************************/
package org.deved.antlride.core.model.ast.criteria;
import org.deved.antlride.core.model.ElementKind;
public class ModelElementCriteriaFactory {
private static IModelElementCriteria RULE_OR_TOKEN = or(
kind(ElementKind.RULE), kind(ElementKind.TOKEN));
private static IModelElementCriteria PREDICATES = or(
kind(ElementKind.SEMPRED), kind(ElementKind.SYN_PRED));
private static IModelElementCriteria LEXER_RULE = and(
kind(ElementKind.RULE), LexerRuleCriteria.CRITERIA);
private static IModelElementCriteria LITERAL_REFERENCE = and(
kind(ElementKind.CALL), LiteralReferenceCriteria.CRITERIA);
private static IModelElementCriteria IGNORED_RULE = and(LEXER_RULE,
IgnoredRuleCriteria.CRITERIA);
private static IModelElementCriteria SLITERAL = new ModelElementPatternCriteria(
"\".*\"");
private static IModelElementCriteria CLITERAL = new ModelElementPatternCriteria(
"'.*'");
private static IModelElementCriteria CLITERAL_OR_SLITERAL = or(SLITERAL,
CLITERAL);
/**
* Kind criteria's
*/
private static IModelElementCriteria CALL_OR_VARIABLE = or(
kind(ElementKind.CALL), kind(ElementKind.VARIABLE));
private static IModelElementCriteria GSCOPE_OR_RSCOPE = or(
kind(ElementKind.GRAMMAR_SCOPE), kind(ElementKind.RULE_SCOPE));
private static IModelElementCriteria GSCOPEATTRIBUTE_OR_RSCOPEATTRIBUTE = or(
kind(ElementKind.GRAMMAR_SCOPE_ATTRIBUTE),
kind(ElementKind.RULE_SCOPE_ATTRIBUTE));
public static IModelElementCriteria and(IModelElementCriteria left,
IModelElementCriteria right) {
return new ModelElementAndCriteria(left, right);
}
public static IModelElementCriteria or(IModelElementCriteria left,
IModelElementCriteria right) {
return new ModelElementOrCriteria(left, right);
}
public static IModelElementCriteria not(IModelElementCriteria criteria) {
return new ModelElementNotCriteria(criteria);
}
public static IModelElementCriteria kind(ElementKind kind) {
return new ModelElementKindCriteria(kind);
}
public static IModelElementCriteria nameEquals(String elementName) {
return new ModelElementNameCriteria(
ModelElementNameCriteria.EQ_OPERATOR, elementName);
}
public static IModelElementCriteria nameStartsWith(String elementName) {
return new ModelElementNameCriteria(
ModelElementNameCriteria.SW_OPERATOR, elementName);
}
public static IModelElementCriteria pattern(String pattern) {
return new ModelElementPatternCriteria(pattern);
}
public static IModelElementCriteria sourcePosition(int position) {
return new ModelElementSourcePositionCriteria(position);
}
public static IModelElementCriteria call(String elementName) {
IModelElementCriteria criteria = kind(ElementKind.VARIABLE);
if (elementName != null && elementName.length() > 0) {
criteria = ModelElementCriteriaFactory.and(criteria,
ModelElementCriteriaFactory.nameEquals(elementName));
}
return criteria;
}
public static IModelElementCriteria ruleOrToken() {
return RULE_OR_TOKEN;
}
public static IModelElementCriteria predicates() {
return PREDICATES;
}
public static IModelElementCriteria charLiteralOrStringLiteral() {
return CLITERAL_OR_SLITERAL;
}
public static IModelElementCriteria lexerRule() {
return LEXER_RULE;
}
public static IModelElementCriteria literalReference() {
return LITERAL_REFERENCE;
}
public static IModelElementCriteria ignoredRule() {
return IGNORED_RULE;
}
public static IModelElementCriteria grammarScopeOrRuleScope() {
return GSCOPE_OR_RSCOPE;
}
public static IModelElementCriteria grammarScopeAttributeOrRuleScopeAttribute() {
return GSCOPEATTRIBUTE_OR_RSCOPEATTRIBUTE;
}
public static IModelElementCriteria callOrVariable() {
return CALL_OR_VARIABLE;
}
public static IModelElementCriteria callOrVariable(String elementName) {
IModelElementCriteria criteria = CALL_OR_VARIABLE;
if (elementName != null && elementName.length() > 0) {
criteria = ModelElementCriteriaFactory.and(criteria,
ModelElementCriteriaFactory.nameEquals(elementName));
}
return criteria;
}
}