package fr.adrienbrault.idea.symfony2plugin.doctrine.completion;
import com.intellij.codeInsight.completion.*;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.codeInsight.lookup.LookupElementPresentation;
import com.intellij.patterns.PlatformPatterns;
import com.intellij.psi.PsiElement;
import com.intellij.util.ProcessingContext;
import com.jetbrains.php.lang.psi.elements.ConstantReference;
import com.jetbrains.php.lang.psi.elements.MethodReference;
import com.jetbrains.php.lang.psi.elements.PhpClass;
import fr.adrienbrault.idea.symfony2plugin.Symfony2Icons;
import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent;
import fr.adrienbrault.idea.symfony2plugin.completion.lookup.ClassConstantLookupElementAbstract;
import fr.adrienbrault.idea.symfony2plugin.doctrine.EntityHelper;
import fr.adrienbrault.idea.symfony2plugin.util.PhpElementsUtil;
import fr.adrienbrault.idea.symfony2plugin.util.dict.DoctrineModel;
import org.jetbrains.annotations.NotNull;
import java.util.Collection;
/**
* @author Daniel Espendiller <daniel@espendiller.net>
*/
public class DoctrineCompletionContributor extends CompletionContributor {
public DoctrineCompletionContributor() {
// getRepository(FOO) -> getRepository(FOO::class)
extend(CompletionType.BASIC, PlatformPatterns.psiElement().withParent(ConstantReference.class), new CompletionProvider<CompletionParameters>() {
@Override
protected void addCompletions(@NotNull CompletionParameters completionParameters, ProcessingContext processingContext, @NotNull CompletionResultSet completionResultSet) {
PsiElement psiElement = completionParameters.getOriginalPosition();
if (!Symfony2ProjectComponent.isEnabled(psiElement)) {
return;
}
MethodReference methodReference = PhpElementsUtil.findMethodReferenceOnClassConstant(psiElement);
if (methodReference == null) {
return;
}
if(!(
PhpElementsUtil.isMethodReferenceInstanceOf(methodReference, "Doctrine\\Common\\Persistence\\ObjectManager", "getRepository") ||
PhpElementsUtil.isMethodReferenceInstanceOf(methodReference, "Doctrine\\Common\\Persistence\\ManagerRegistry", "getRepository")
)) {
return;
}
Collection<DoctrineModel> modelClasses = EntityHelper.getModelClasses(psiElement.getProject());
for (DoctrineModel doctrineModel : modelClasses) {
PhpClass phpClass = doctrineModel.getPhpClass();
if(phpClass.isAbstract() || phpClass.isInterface()) {
continue;
}
LookupElement elementBuilder = new Foo(phpClass);
// does this have an effect really?
completionResultSet.addElement(
PrioritizedLookupElement.withExplicitProximity(PrioritizedLookupElement.withPriority(elementBuilder, 1000), 1000)
);
}
}
});
}
private static class Foo extends ClassConstantLookupElementAbstract {
public Foo(@NotNull PhpClass phpClass) {
super(phpClass);
}
@Override
public void renderElement(LookupElementPresentation presentation) {
super.renderElement(presentation);
presentation.setIcon(Symfony2Icons.DOCTRINE);
}
}
}