Skip to content

Commit 8c7bee1

Browse files
authored
Merge pull request #1901 from Haehnchen/feature/1366-commands-used
#1366 mark command class register as service as used code
2 parents 5f84c9b + 4271c8a commit 8c7bee1

File tree

4 files changed

+47
-5
lines changed

4 files changed

+47
-5
lines changed

src/main/java/fr/adrienbrault/idea/symfony2plugin/codeInsight/SymfonyImplicitUsageProvider.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import de.espend.idea.php.annotation.dict.PhpDocCommentAnnotation;
1010
import de.espend.idea.php.annotation.util.AnnotationUtil;
1111
import fr.adrienbrault.idea.symfony2plugin.routing.RouteHelper;
12+
import fr.adrienbrault.idea.symfony2plugin.util.PhpElementsUtil;
13+
import fr.adrienbrault.idea.symfony2plugin.util.dict.ServiceUtil;
1214
import org.jetbrains.annotations.NotNull;
1315

1416
import java.util.Collection;
@@ -27,15 +29,25 @@ public boolean isImplicitUsage(@NotNull PsiElement element) {
2729
if (element instanceof Method && ((Method) element).getAccess() == PhpModifier.Access.PUBLIC) {
2830
return isMethodARoute((Method) element);
2931
} else if (element instanceof PhpClass) {
30-
return ((PhpClass) element).getMethods()
31-
.stream()
32-
.filter(method -> method.getAccess() == PhpModifier.Access.PUBLIC)
33-
.anyMatch(this::isMethodARoute);
32+
return isRouteClass((PhpClass) element)
33+
|| isCommandAndService((PhpClass) element);
3434
}
3535

3636
return false;
3737
}
3838

39+
private boolean isRouteClass(@NotNull PhpClass phpClass) {
40+
return phpClass.getMethods()
41+
.stream()
42+
.filter(method -> method.getAccess() == PhpModifier.Access.PUBLIC)
43+
.anyMatch(this::isMethodARoute);
44+
}
45+
46+
private boolean isCommandAndService(PhpClass element) {
47+
return PhpElementsUtil.isInstanceOf(element, "\\Symfony\\Component\\Console\\Command\\Command")
48+
&& ServiceUtil.isPhpClassAService(element);
49+
}
50+
3951
@Override
4052
public boolean isImplicitRead(@NotNull PsiElement element) {
4153
return false;

src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/codeInsight/SymfonyImplicitUsageProviderTest.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,26 @@ public void testControllerForDefinitionInsideYamlAsService() {
117117
)));
118118
}
119119

120+
public void testCommandRegisteredAsServiceAreMarkedUsed() {
121+
PsiFile psiFile = myFixture.configureByText(PhpFileType.INSTANCE, "<?php\n" +
122+
"namespace App\\Command;\n" +
123+
"class FooCommand extends \\Symfony\\Component\\Console\\Command\\Command {}"
124+
);
125+
126+
PhpClass firstClassFromFile = PhpElementsUtil.getFirstClassFromFile((PhpFile) psiFile.getContainingFile());
127+
assertTrue(new SymfonyImplicitUsageProvider().isImplicitUsage(firstClassFromFile));
128+
}
129+
130+
public void testCommandRegisteredNotAsServiceIsUntouched() {
131+
PsiFile psiFile = myFixture.configureByText(PhpFileType.INSTANCE, "<?php\n" +
132+
"namespace App\\Command;\n" +
133+
"class FoobarServiceCommand extends \\Symfony\\Component\\Console\\Command\\Command {}"
134+
);
135+
136+
PhpClass firstClassFromFile = PhpElementsUtil.getFirstClassFromFile((PhpFile) psiFile.getContainingFile());
137+
assertFalse(new SymfonyImplicitUsageProvider().isImplicitUsage(firstClassFromFile));
138+
}
139+
120140
private PhpClass createPhpControllerClassWithRouteContent(@NotNull String content) {
121141
return createPhpControllerClassWithRouteContent("\\App\\Controller\\FooController", content);
122142
}

src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/codeInsight/fixtures/classes.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,11 @@
66
* @Annotation
77
*/
88
class Route {}
9+
}
10+
11+
namespace Symfony\Component\Console\Command
12+
{
13+
class Command
14+
{
15+
}
916
}

src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/codeInsight/fixtures/services.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,7 @@ services:
33
class: App\Controller\FooControllerService
44

55
foo_controller.service_invoke:
6-
class: App\Controller\FooControllerServiceInvoke
6+
class: App\Controller\FooControllerServiceInvoke
7+
8+
foo_command.foo_command:
9+
class: App\Command\FooCommand

0 commit comments

Comments
 (0)