package fr.adrienbrault.idea.symfony2plugin.doctrine.querybuilder.util;
import com.intellij.psi.PsiElement;
import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent;
import fr.adrienbrault.idea.symfony2plugin.util.MethodMatcher;
import org.jetbrains.annotations.Nullable;
/**
* @author Daniel Espendiller <daniel@espendiller.net>
*/
public class MatcherUtil {
private static MethodMatcher.CallToSignature[] SELECT_FIELDS = new MethodMatcher.CallToSignature[] {
new MethodMatcher.CallToSignature("\\Doctrine\\ORM\\QueryBuilder", "orderBy"),
new MethodMatcher.CallToSignature("\\Doctrine\\ORM\\QueryBuilder", "addOrderBy"),
new MethodMatcher.CallToSignature("\\Doctrine\\ORM\\QueryBuilder", "set"),
};
private static MethodMatcher.CallToSignature[] SELECT_FIELDS_VARIADIC = new MethodMatcher.CallToSignature[] {
new MethodMatcher.CallToSignature("\\Doctrine\\ORM\\QueryBuilder", "select"),
new MethodMatcher.CallToSignature("\\Doctrine\\ORM\\QueryBuilder", "addSelect"),
new MethodMatcher.CallToSignature("\\Doctrine\\ORM\\QueryBuilder", "groupBy"),
new MethodMatcher.CallToSignature("\\Doctrine\\ORM\\QueryBuilder", "addGroupBy"),
};
@Nullable
public static MethodMatcher.MethodMatchParameter matchPropertyField(PsiElement psiElement) {
if (!Symfony2ProjectComponent.isEnabled(psiElement)) {
return null;
}
MethodMatcher.MethodMatchParameter methodMatchParameter = new MethodMatcher.StringParameterAnyMatcher(psiElement)
.withSignature(SELECT_FIELDS)
.match();
if(methodMatchParameter == null) {
methodMatchParameter = new MethodMatcher.StringParameterAnyMatcher(psiElement)
.withSignature(SELECT_FIELDS_VARIADIC)
.match();
}
if(methodMatchParameter == null) {
methodMatchParameter = new MethodMatcher.ArrayParameterMatcher(psiElement, 0)
.withSignature(SELECT_FIELDS)
.match();
}
return methodMatchParameter;
}
@Nullable
public static MethodMatcher.MethodMatchParameter matchJoin(PsiElement psiElement) {
return new MethodMatcher.StringParameterMatcher(psiElement, 0)
.withSignature("\\Doctrine\\ORM\\QueryBuilder", "join")
.withSignature("\\Doctrine\\ORM\\QueryBuilder", "leftJoin")
.withSignature("\\Doctrine\\ORM\\QueryBuilder", "rightJoin")
.withSignature("\\Doctrine\\ORM\\QueryBuilder", "innerJoin")
.match();
}
}