package fr.adrienbrault.idea.symfony2plugin.external.toolbox.provider; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.psi.PsiElement; import com.jetbrains.php.lang.psi.elements.PhpClass; import com.jetbrains.php.lang.psi.elements.PhpNamedElement; import de.espend.idea.php.toolbox.completion.dict.PhpToolboxCompletionContributorParameter; import de.espend.idea.php.toolbox.extension.PhpToolboxProviderAbstract; import de.espend.idea.php.toolbox.navigation.dict.PhpToolboxDeclarationHandlerParameter; import de.espend.idea.php.toolbox.provider.presentation.ProviderParameter; import de.espend.idea.php.toolbox.provider.presentation.ProviderPresentation; import de.espend.idea.php.toolbox.type.PhpToolboxTypeProviderArguments; import de.espend.idea.php.toolbox.type.PhpToolboxTypeProviderInterface; import fr.adrienbrault.idea.symfony2plugin.Symfony2Icons; import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent; import fr.adrienbrault.idea.symfony2plugin.dic.ContainerService; import fr.adrienbrault.idea.symfony2plugin.dic.ServiceStringLookupElement; import fr.adrienbrault.idea.symfony2plugin.stubs.ContainerCollectionResolver; import fr.adrienbrault.idea.symfony2plugin.util.dict.ServiceUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; /** * @author Daniel Espendiller <daniel@espendiller.net> */ public class ServiceToolboxProvider extends PhpToolboxProviderAbstract implements PhpToolboxTypeProviderInterface { @NotNull @Override public Collection<LookupElement> getLookupElements(@NotNull PhpToolboxCompletionContributorParameter parameter) { if(!Symfony2ProjectComponent.isEnabled(parameter.getProject())) { return Collections.emptyList(); } List<LookupElement> results = new ArrayList<>(); Boolean aPrivate = parameter.getParameterBag().getParameterBool("private", false); Boolean aPublic = parameter.getParameterBag().getParameterBool("public", true); for (ContainerService service : ContainerCollectionResolver.getServices(parameter.getProject()).values()) { if(service.isPrivate() == aPrivate) { results.add(new ServiceStringLookupElement(service)); continue; } if(service.isPrivate() != aPublic) { results.add(new ServiceStringLookupElement(service)); } } return results; } @NotNull @Override public Collection<PsiElement> getPsiTargets(@NotNull PhpToolboxDeclarationHandlerParameter parameter) { if(!Symfony2ProjectComponent.isEnabled(parameter.getProject())) { return Collections.emptyList(); } final PhpClass serviceClass = ServiceUtil.getServiceClass(parameter.getProject(), parameter.getContents()); if(serviceClass == null) { return Collections.emptyList(); } return new ArrayList<PsiElement>() {{ add(serviceClass); }}; } @NotNull @Override public String getName() { return "symfony.services"; } @Nullable @Override public ProviderPresentation getPresentation() { return new ProviderPresentation() { @Nullable @Override public Icon getIcon() { return Symfony2Icons.SERVICE; } @Nullable @Override public String getDescription() { return "Public services"; } @Nullable public ProviderParameter[] getParameter() { return new ProviderParameter[] { new ProviderParameter("private", ProviderParameter.TYPE.BOOLEAN), new ProviderParameter("public", ProviderParameter.TYPE.BOOLEAN), }; } }; } @Nullable @Override public Collection<PhpNamedElement> resolveParameter(@NotNull PhpToolboxTypeProviderArguments arguments) { PhpClass serviceClass = ServiceUtil.getServiceClass(arguments.getProject(), arguments.getParameter()); if(serviceClass == null) { return null; } return new ArrayList<PhpNamedElement>(){{ add(serviceClass); }}; } }