package fr.adrienbrault.idea.symfony2plugin.doctrine.querybuilder.detector;
import com.intellij.psi.PsiElement;
import com.intellij.psi.util.PsiTreeUtil;
import com.jetbrains.php.lang.parser.PhpElementTypes;
import com.jetbrains.php.lang.psi.elements.*;
import fr.adrienbrault.idea.symfony2plugin.doctrine.EntityHelper;
import fr.adrienbrault.idea.symfony2plugin.util.PhpElementsUtil;
import org.apache.commons.lang.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* @author Daniel Espendiller <daniel@espendiller.net>
*/
public class FormQueryBuilderRepositoryDetector implements QueryBuilderRepositoryDetector {
@Nullable
@Override
public String getRepository(@NotNull QueryBuilderRepositoryDetectorParameter parameter) {
MethodReference qbMethodRef = parameter.getMethodReferenceByName("createQueryBuilder");
if(qbMethodRef == null) {
return null;
}
/*
$builder->add('field_1', 'foo', array(
'class' => 'Repository',
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('u')
->orderBy('u.field_1', 'ASC');
},
));
*/
Function parentOfType = PsiTreeUtil.getParentOfType(qbMethodRef, Function.class);
if(parentOfType != null && parentOfType.isClosure()) {
PsiElement closure = parentOfType.getParent();
if(closure.getNode().getElementType() == PhpElementTypes.CLOSURE) {
PsiElement arrayValue = closure.getParent();
if(arrayValue.getNode().getElementType() == PhpElementTypes.ARRAY_VALUE) {
PsiElement arrayHash = arrayValue.getParent();
if(arrayHash instanceof ArrayHashElement) {
PsiElement arrayCreation = arrayHash.getParent();
if(arrayCreation instanceof ArrayCreationExpression) {
String aClass = PhpElementsUtil.getArrayValueString((ArrayCreationExpression) arrayCreation, "class");
if(aClass != null && StringUtils.isNotBlank(aClass)) {
// finally we found our class key
PhpClass phpClass = EntityHelper.resolveShortcutName(parameter.getProject(), aClass);
if(phpClass != null) {
return phpClass.getPresentableFQN();
}
}
}
}
}
}
}
return null;
}
}