From 243d9896900b989f2793edf7ea0e08952d4ee056 Mon Sep 17 00:00:00 2001 From: Cedric Ziel Date: Tue, 21 Aug 2018 10:46:28 +0200 Subject: [PATCH 1/3] Move write action out of AWT event for PhpServiceArgumentIntention Fixes: #1184 --- .../PhpServiceArgumentIntention.java | 93 ++++++++++--------- 1 file changed, 50 insertions(+), 43 deletions(-) diff --git a/src/main/java/fr/adrienbrault/idea/symfony2plugin/dic/intention/PhpServiceArgumentIntention.java b/src/main/java/fr/adrienbrault/idea/symfony2plugin/dic/intention/PhpServiceArgumentIntention.java index 345b03033..f16835d1f 100644 --- a/src/main/java/fr/adrienbrault/idea/symfony2plugin/dic/intention/PhpServiceArgumentIntention.java +++ b/src/main/java/fr/adrienbrault/idea/symfony2plugin/dic/intention/PhpServiceArgumentIntention.java @@ -10,7 +10,7 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.xml.XmlTag; -import com.intellij.ui.components.JBList; +import com.intellij.util.Consumer; import com.intellij.util.IncorrectOperationException; import com.jetbrains.php.lang.PhpLanguage; import com.jetbrains.php.lang.psi.elements.PhpClass; @@ -30,57 +30,63 @@ public class PhpServiceArgumentIntention extends PsiElementBaseIntentionAction { @Override public void invoke(@NotNull Project project, Editor editor, @NotNull PsiElement psiElement) throws IncorrectOperationException { PhpClass phpClass = PsiTreeUtil.getParentOfType(psiElement, PhpClass.class); - if(phpClass != null) { - Set serviceNames = ContainerCollectionResolver.ServiceCollector.create(project).convertClassNameToServices(phpClass.getFQN()); - if(serviceNames.size() > 0) { - Collection psiElements = new ArrayList<>(); - for(String serviceName: serviceNames) { - psiElements.addAll(ServiceIndexUtil.findServiceDefinitions(project, serviceName)); - } - - if(psiElements.size() > 0) { - Map map = new HashMap<>(); - - for (PsiElement element : psiElements) { - map.put(VfsUtil.getRelativePath(element.getContainingFile().getVirtualFile(), element.getProject().getBaseDir()), element); - } - - final JBList list = new JBList<>(map.keySet()); - - JBPopupFactory.getInstance().createListPopupBuilder(list) - .setTitle("Symfony: Services Definitions") - .setItemChoosenCallback(() -> new WriteCommandAction.Simple(editor.getProject(), "Service Update") { - @Override - protected void run() { - String selectedValue = list.getSelectedValue(); - - PsiElement target = map.get(selectedValue); - invokeByScope(target, editor); - } - }.execute()) - .createPopup() - .showInBestPositionFor(editor); - } - } + if (phpClass == null) { + + return; + } + + Set serviceNames = ContainerCollectionResolver.ServiceCollector.create(project).convertClassNameToServices(phpClass.getFQN()); + if (serviceNames.isEmpty()) { + + return; + } + + Collection psiElements = new ArrayList<>(); + for (String serviceName : serviceNames) { + psiElements.addAll(ServiceIndexUtil.findServiceDefinitions(project, serviceName)); } + + if (psiElements.isEmpty()) { + + return; + } + + Map map = new HashMap<>(); + + for (PsiElement element : psiElements) { + map.put(VfsUtil.getRelativePath(element.getContainingFile().getVirtualFile(), element.getProject().getBaseDir()), element); + } + + Consumer consumer = (selected) -> { + WriteCommandAction.writeCommandAction(project).withName("Service Update").run(() -> { + invokeByScope(map.get(selected), editor); + }); + }; + + JBPopupFactory.getInstance().createPopupChooserBuilder(new ArrayList<>(map.keySet())) + .setTitle("Symfony: Services Definitions") + .setItemChosenCallback(consumer) + .createPopup() + .showInBestPositionFor(editor) + ; } private void invokeByScope(@NotNull PsiElement psiElement, @NotNull Editor editor) { boolean success = false; - if(psiElement instanceof XmlTag) { + if (psiElement instanceof XmlTag) { List args = ServiceActionUtil.getXmlMissingArgumentTypes((XmlTag) psiElement, true, new ContainerCollectionResolver.LazyServiceCollector(psiElement.getProject())); success = args.size() > 0; if (success) { ServiceActionUtil.fixServiceArgument(args, (XmlTag) psiElement); } - } else if(psiElement instanceof YAMLKeyValue) { + } else if (psiElement instanceof YAMLKeyValue) { List args = ServiceActionUtil.getYamlMissingArgumentTypes( - psiElement.getProject(), - ServiceActionUtil.ServiceYamlContainer.create((YAMLKeyValue) psiElement), - false, - new ContainerCollectionResolver.LazyServiceCollector(psiElement.getProject()) + psiElement.getProject(), + ServiceActionUtil.ServiceYamlContainer.create((YAMLKeyValue) psiElement), + false, + new ContainerCollectionResolver.LazyServiceCollector(psiElement.getProject()) ); success = args.size() > 0; @@ -89,13 +95,14 @@ private void invokeByScope(@NotNull PsiElement psiElement, @NotNull Editor edito } } - if(!success) { + if (!success) { HintManager.getInstance().showErrorHint(editor, "No argument update needed"); + return; } String relativePath = VfsUtil.getRelativePath(psiElement.getContainingFile().getVirtualFile(), psiElement.getProject().getBaseDir()); - if(relativePath == null) { + if (relativePath == null) { relativePath = "n/a"; } @@ -125,7 +132,7 @@ private Set getServicesInScope(@NotNull PsiElement psiElement) { PhpClass phpClass = PsiTreeUtil.getParentOfType(psiElement, PhpClass.class); return phpClass == null - ? Collections.emptySet() - : ContainerCollectionResolver.ServiceCollector.create(psiElement.getProject()).convertClassNameToServices(phpClass.getFQN()); + ? Collections.emptySet() + : ContainerCollectionResolver.ServiceCollector.create(psiElement.getProject()).convertClassNameToServices(phpClass.getFQN()); } } From 0e8c1f44349d2287540af9359f497f13763e4ee5 Mon Sep 17 00:00:00 2001 From: Cedric Ziel Date: Tue, 21 Aug 2018 10:58:52 +0200 Subject: [PATCH 2/3] Move back to JBList to support legacy platform --- .../dic/intention/PhpServiceArgumentIntention.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/fr/adrienbrault/idea/symfony2plugin/dic/intention/PhpServiceArgumentIntention.java b/src/main/java/fr/adrienbrault/idea/symfony2plugin/dic/intention/PhpServiceArgumentIntention.java index f16835d1f..b1a84a4d2 100644 --- a/src/main/java/fr/adrienbrault/idea/symfony2plugin/dic/intention/PhpServiceArgumentIntention.java +++ b/src/main/java/fr/adrienbrault/idea/symfony2plugin/dic/intention/PhpServiceArgumentIntention.java @@ -10,6 +10,7 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.xml.XmlTag; +import com.intellij.ui.components.JBList; import com.intellij.util.Consumer; import com.intellij.util.IncorrectOperationException; import com.jetbrains.php.lang.PhpLanguage; @@ -63,7 +64,8 @@ public void invoke(@NotNull Project project, Editor editor, @NotNull PsiElement }); }; - JBPopupFactory.getInstance().createPopupChooserBuilder(new ArrayList<>(map.keySet())) + final JBList list = new JBList<>(map.keySet()); + JBPopupFactory.getInstance().createListPopupBuilder(list) .setTitle("Symfony: Services Definitions") .setItemChosenCallback(consumer) .createPopup() From 79623036f160d218c4eb95da04ac70e0544f4991 Mon Sep 17 00:00:00 2001 From: Cedric Ziel Date: Tue, 11 Sep 2018 19:21:35 +0200 Subject: [PATCH 3/3] Inline Callback --- .../dic/intention/PhpServiceArgumentIntention.java | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/main/java/fr/adrienbrault/idea/symfony2plugin/dic/intention/PhpServiceArgumentIntention.java b/src/main/java/fr/adrienbrault/idea/symfony2plugin/dic/intention/PhpServiceArgumentIntention.java index b1a84a4d2..ac98cc52d 100644 --- a/src/main/java/fr/adrienbrault/idea/symfony2plugin/dic/intention/PhpServiceArgumentIntention.java +++ b/src/main/java/fr/adrienbrault/idea/symfony2plugin/dic/intention/PhpServiceArgumentIntention.java @@ -11,7 +11,6 @@ import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.xml.XmlTag; import com.intellij.ui.components.JBList; -import com.intellij.util.Consumer; import com.intellij.util.IncorrectOperationException; import com.jetbrains.php.lang.PhpLanguage; import com.jetbrains.php.lang.psi.elements.PhpClass; @@ -58,16 +57,14 @@ public void invoke(@NotNull Project project, Editor editor, @NotNull PsiElement map.put(VfsUtil.getRelativePath(element.getContainingFile().getVirtualFile(), element.getProject().getBaseDir()), element); } - Consumer consumer = (selected) -> { - WriteCommandAction.writeCommandAction(project).withName("Service Update").run(() -> { - invokeByScope(map.get(selected), editor); - }); - }; - final JBList list = new JBList<>(map.keySet()); JBPopupFactory.getInstance().createListPopupBuilder(list) .setTitle("Symfony: Services Definitions") - .setItemChosenCallback(consumer) + .setItemChoosenCallback(() -> { + WriteCommandAction.writeCommandAction(project).withName("Service Update").run(() -> { + invokeByScope(map.get(list.getSelectedValue()), editor); + }); + }) .createPopup() .showInBestPositionFor(editor) ;