package fr.adrienbrault.idea.symfony2plugin.dic;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiPolyVariantReferenceBase;
import com.intellij.psi.ResolveResult;
import com.intellij.util.containers.ContainerUtil;
import fr.adrienbrault.idea.symfony2plugin.stubs.ContainerCollectionResolver;
import fr.adrienbrault.idea.symfony2plugin.util.PhpElementsUtil;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* @author Daniel Espendiller <daniel@espendiller.net>
*/
abstract public class AbstractServiceReference extends PsiPolyVariantReferenceBase<PsiElement> {
protected String serviceId;
protected boolean usePrivateServices = true;
public AbstractServiceReference(PsiElement psiElement) {
super(psiElement);
}
@NotNull
@Override
public ResolveResult[] multiResolve(boolean incompleteCode) {
List<ResolveResult> resolveResults = new ArrayList<>();
ContainerCollectionResolver.ServiceCollector collector = ContainerCollectionResolver
.ServiceCollector.create(getElement().getProject());
// Return the PsiElement for the class corresponding to the serviceId
String serviceClass = collector.resolve(serviceId);
if (serviceClass == null) {
return resolveResults.toArray(new ResolveResult[resolveResults.size()]);
}
resolveResults.addAll(PhpElementsUtil.getClassInterfaceResolveResult(getElement().getProject(), serviceClass));
return resolveResults.toArray(new ResolveResult[resolveResults.size()]);
}
@NotNull
@Override
public Object[] getVariants() {
List<LookupElement> results = new ArrayList<>();
ContainerCollectionResolver.ServiceCollector collector = ContainerCollectionResolver
.ServiceCollector.create(getElement().getProject());
Collection<ContainerService> values = collector.getServices().values();
if(!usePrivateServices) {
values = ContainerUtil.filter(values, service -> !service.isPrivate());
}
results.addAll(
ServiceCompletionProvider.getLookupElements(null, values).getLookupElements()
);
return results.toArray();
}
}