Skip to content

Commit 133d25e

Browse files
committed
provide navigation targets for service definition inside php files
1 parent ad749c8 commit 133d25e

File tree

7 files changed

+57
-19
lines changed

7 files changed

+57
-19
lines changed

src/main/java/fr/adrienbrault/idea/symfony2plugin/dic/container/util/ServiceContainerUtil.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,7 @@ public static void visitFile(@NotNull PhpFile phpFile, @NotNull Consumer<Service
341341
}
342342
}
343343

344-
consumer.consume(new ServiceConsumer(psiElement, serviceName, new PhpKeyValueAttributeValue(psiElement, keyValue), ServiceFileDefaults.EMPTY));
344+
consumer.consume(new ServiceConsumer(parameters[0], serviceName, new PhpKeyValueAttributeValue(psiElement, keyValue), ServiceFileDefaults.EMPTY));
345345
}
346346

347347
// ->alias(TranslatorInterface::class, 'translator')
@@ -364,7 +364,7 @@ public static void visitFile(@NotNull PhpFile phpFile, @NotNull Consumer<Service
364364
}
365365
}
366366

367-
consumer.consume(new ServiceConsumer(psiElement, serviceName, new PhpKeyValueAttributeValue(psiElement, keyValue), ServiceFileDefaults.EMPTY));
367+
consumer.consume(new ServiceConsumer(parameters[0], serviceName, new PhpKeyValueAttributeValue(psiElement, keyValue), ServiceFileDefaults.EMPTY));
368368
}
369369
}
370370
}

src/main/java/fr/adrienbrault/idea/symfony2plugin/stubs/ServiceIndexUtil.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,13 @@
1818
import com.intellij.psi.xml.XmlFile;
1919
import com.intellij.util.indexing.FileBasedIndex;
2020
import com.jetbrains.php.lang.PhpFileType;
21+
import com.jetbrains.php.lang.psi.PhpFile;
2122
import com.jetbrains.php.lang.psi.elements.PhpClass;
2223
import fr.adrienbrault.idea.symfony2plugin.config.xml.XmlHelper;
2324
import fr.adrienbrault.idea.symfony2plugin.dic.ClassServiceDefinitionTargetLazyValue;
2425
import fr.adrienbrault.idea.symfony2plugin.dic.ContainerService;
2526
import fr.adrienbrault.idea.symfony2plugin.dic.container.ServiceInterface;
27+
import fr.adrienbrault.idea.symfony2plugin.dic.container.util.ServiceContainerUtil;
2628
import fr.adrienbrault.idea.symfony2plugin.extension.ServiceDefinitionLocator;
2729
import fr.adrienbrault.idea.symfony2plugin.extension.ServiceDefinitionLocatorParameter;
2830
import fr.adrienbrault.idea.symfony2plugin.stubs.indexes.ServicesDefinitionStubIndex;
@@ -58,9 +60,9 @@ public static VirtualFile[] findServiceDefinitionFiles(@NotNull Project project,
5860
FileBasedIndex.getInstance().getFilesWithKey(ServicesDefinitionStubIndex.KEY, new HashSet<>(Collections.singletonList(serviceName.toLowerCase())), virtualFile -> {
5961
virtualFiles.add(virtualFile);
6062
return true;
61-
}, GlobalSearchScope.getScopeRestrictedByFileTypes(GlobalSearchScope.allScope(project), XmlFileType.INSTANCE, YAMLFileType.YML));
63+
}, getRestrictedFileTypesScope(project));
6264

63-
return virtualFiles.toArray(new VirtualFile[virtualFiles.size()]);
65+
return virtualFiles.toArray(new VirtualFile[0]);
6466

6567
}
6668

@@ -78,15 +80,18 @@ public static List<PsiElement> findServiceDefinitions(@NotNull Project project,
7880
if(servicePsiElement != null) {
7981
items.add(servicePsiElement);
8082
}
81-
}
82-
83-
if(psiFile instanceof XmlFile) {
83+
} else if(psiFile instanceof XmlFile) {
8484
PsiElement servicePsiElement = XmlHelper.getLocalServiceName(psiFile, serviceName);
8585
if(servicePsiElement != null) {
8686
items.add(servicePsiElement);
8787
}
88+
} else if(psiFile instanceof PhpFile) {
89+
ServiceContainerUtil.visitFile((PhpFile) psiFile, service -> {
90+
if (serviceName.equalsIgnoreCase(service.getServiceId())) {
91+
items.add(service.getPsiElement());
92+
}
93+
});
8894
}
89-
9095
}
9196

9297
// extension points

src/main/java/fr/adrienbrault/idea/symfony2plugin/util/completion/TagNameCompletionProvider.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import com.intellij.codeInsight.completion.CompletionProvider;
55
import com.intellij.codeInsight.completion.CompletionResultSet;
66
import com.intellij.codeInsight.lookup.LookupElement;
7-
import com.intellij.ide.highlighter.XmlFileType;
87
import com.intellij.openapi.project.Project;
98
import com.intellij.psi.search.GlobalSearchScope;
109
import com.intellij.util.ProcessingContext;
@@ -13,12 +12,12 @@
1312
import fr.adrienbrault.idea.symfony2plugin.completion.lookup.ContainerTagLookupElement;
1413
import fr.adrienbrault.idea.symfony2plugin.dic.XmlTagParser;
1514
import fr.adrienbrault.idea.symfony2plugin.dic.container.dict.ContainerBuilderCall;
15+
import fr.adrienbrault.idea.symfony2plugin.stubs.ServiceIndexUtil;
1616
import fr.adrienbrault.idea.symfony2plugin.stubs.SymfonyProcessors;
1717
import fr.adrienbrault.idea.symfony2plugin.stubs.indexes.ContainerBuilderStubIndex;
1818
import fr.adrienbrault.idea.symfony2plugin.stubs.indexes.ServicesTagStubIndex;
1919
import fr.adrienbrault.idea.symfony2plugin.util.service.ServiceXmlParserFactory;
2020
import org.jetbrains.annotations.NotNull;
21-
import org.jetbrains.yaml.YAMLFileType;
2221

2322
import java.util.*;
2423

@@ -50,7 +49,7 @@ public static Collection<LookupElement> getTagLookupElements(@NotNull Project pr
5049
}
5150

5251
for(String serviceName: SymfonyProcessors.createResult(project, ServicesTagStubIndex.KEY)) {
53-
List<Set<String>> tags = FileBasedIndex.getInstance().getValues(ServicesTagStubIndex.KEY, serviceName, GlobalSearchScope.getScopeRestrictedByFileTypes(GlobalSearchScope.allScope(project), XmlFileType.INSTANCE, YAMLFileType.YML));
52+
List<Set<String>> tags = FileBasedIndex.getInstance().getValues(ServicesTagStubIndex.KEY, serviceName, ServiceIndexUtil.getRestrictedFileTypesScope(project));
5453
for(Set<String> tagDef: tags) {
5554
for(String tag: tagDef) {
5655
if(!uniqueTags.contains(tag)) {

src/main/java/fr/adrienbrault/idea/symfony2plugin/util/dict/ServiceUtil.java

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import com.intellij.codeInsight.daemon.RelatedItemLineMarkerInfo;
44
import com.intellij.codeInsight.hint.HintManager;
55
import com.intellij.codeInsight.navigation.NavigationGutterIconBuilder;
6-
import com.intellij.ide.highlighter.XmlFileType;
76
import com.intellij.openapi.command.WriteCommandAction;
87
import com.intellij.openapi.editor.Editor;
98
import com.intellij.openapi.project.Project;
@@ -14,7 +13,6 @@
1413
import com.intellij.psi.PsiElement;
1514
import com.intellij.psi.PsiFile;
1615
import com.intellij.psi.PsiManager;
17-
import com.intellij.psi.search.GlobalSearchScope;
1816
import com.intellij.psi.util.*;
1917
import com.intellij.ui.components.JBList;
2018
import com.intellij.util.Consumer;
@@ -42,7 +40,6 @@
4240
import org.apache.commons.lang.StringUtils;
4341
import org.jetbrains.annotations.NotNull;
4442
import org.jetbrains.annotations.Nullable;
45-
import org.jetbrains.yaml.YAMLFileType;
4643

4744
import java.util.*;
4845

@@ -183,7 +180,7 @@ public static Collection<PsiElement> getParameterDefinition(Project project, Str
183180

184181
Collection<PsiElement> psiElements = new ArrayList<>();
185182

186-
Collection<VirtualFile> fileCollection = FileBasedIndex.getInstance().getContainingFiles(ContainerParameterStubIndex.KEY, parameterName, GlobalSearchScope.getScopeRestrictedByFileTypes(GlobalSearchScope.allScope(project), XmlFileType.INSTANCE, YAMLFileType.YML));
183+
Collection<VirtualFile> fileCollection = FileBasedIndex.getInstance().getContainingFiles(ContainerParameterStubIndex.KEY, parameterName, ServiceIndexUtil.getRestrictedFileTypesScope(project));
187184
for(VirtualFile virtualFile: fileCollection) {
188185
PsiFile psiFile = PsiManager.getInstance(project).findFile(virtualFile);
189186
if(psiFile != null) {
@@ -231,7 +228,7 @@ public static Set<String> getPhpClassTags(@NotNull PhpClass phpClass) {
231228
for (String serviceName : result) {
232229

233230
// get service where we found our tags
234-
List<Set<String>> values = FileBasedIndex.getInstance().getValues(ServicesTagStubIndex.KEY, serviceName, GlobalSearchScope.getScopeRestrictedByFileTypes(GlobalSearchScope.allScope(project), XmlFileType.INSTANCE, YAMLFileType.YML));
231+
List<Set<String>> values = FileBasedIndex.getInstance().getValues(ServicesTagStubIndex.KEY, serviceName, ServiceIndexUtil.getRestrictedFileTypesScope(project));
235232
if(values.size() == 0) {
236233
continue;
237234
}
@@ -292,7 +289,7 @@ public static Set<String> getTaggedServices(Project project, String tagName) {
292289
Set<String> service = new HashSet<>();
293290

294291
for(String serviceName: SymfonyProcessors.createResult(project, ServicesTagStubIndex.KEY)) {
295-
List<Set<String>> serviceDefinitions = FileBasedIndex.getInstance().getValues(ServicesTagStubIndex.KEY, serviceName, GlobalSearchScope.getScopeRestrictedByFileTypes(GlobalSearchScope.allScope(project), XmlFileType.INSTANCE, YAMLFileType.YML));
292+
List<Set<String>> serviceDefinitions = FileBasedIndex.getInstance().getValues(ServicesTagStubIndex.KEY, serviceName, ServiceIndexUtil.getRestrictedFileTypesScope(project));
296293
for(Set<String> strings: serviceDefinitions) {
297294
if(strings.contains(tagName)) {
298295
service.add(serviceName);
@@ -307,11 +304,11 @@ public static Set<String> getTaggedServices(Project project, String tagName) {
307304
public static Set<String> getServiceTags(@NotNull Project project, @NotNull String serviceId) {
308305
Set<String> service = new HashSet<>();
309306

310-
for(Set<String> strings: FileBasedIndex.getInstance().getValues(ServicesTagStubIndex.KEY, serviceId, GlobalSearchScope.getScopeRestrictedByFileTypes(GlobalSearchScope.allScope(project), XmlFileType.INSTANCE, YAMLFileType.YML))) {
307+
for(Set<String> strings: FileBasedIndex.getInstance().getValues(ServicesTagStubIndex.KEY, serviceId, ServiceIndexUtil.getRestrictedFileTypesScope(project))) {
311308
service.addAll(strings);
312309
}
313310

314-
for(Set<String> strings: FileBasedIndex.getInstance().getValues(ServicesTagStubIndex.KEY, serviceId.toLowerCase(), GlobalSearchScope.getScopeRestrictedByFileTypes(GlobalSearchScope.allScope(project), XmlFileType.INSTANCE, YAMLFileType.YML))) {
311+
for(Set<String> strings: FileBasedIndex.getInstance().getValues(ServicesTagStubIndex.KEY, serviceId.toLowerCase(), ServiceIndexUtil.getRestrictedFileTypesScope(project))) {
315312
service.addAll(strings);
316313
}
317314

src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/stubs/ServiceIndexUtilTest.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.intellij.psi.PsiManager;
77
import com.intellij.psi.xml.XmlTag;
88
import com.intellij.util.containers.ContainerUtil;
9+
import com.jetbrains.php.lang.psi.elements.StringLiteralExpression;
910
import fr.adrienbrault.idea.symfony2plugin.dic.ContainerService;
1011
import fr.adrienbrault.idea.symfony2plugin.stubs.ServiceIndexUtil;
1112
import fr.adrienbrault.idea.symfony2plugin.tests.SymfonyLightCodeInsightFixtureTestCase;
@@ -23,6 +24,7 @@
2324
public class ServiceIndexUtilTest extends SymfonyLightCodeInsightFixtureTestCase {
2425
private VirtualFile ymlVirtualFile;
2526
private VirtualFile xmlVirtualFile;
27+
private VirtualFile phpVirtualFile;
2628

2729
public void setUp() throws Exception {
2830
super.setUp();
@@ -31,6 +33,7 @@ public void setUp() throws Exception {
3133

3234
ymlVirtualFile = myFixture.copyFileToProject("services.yml");
3335
xmlVirtualFile = myFixture.copyFileToProject("services.xml");
36+
phpVirtualFile = myFixture.copyFileToProject("services.php");
3437
}
3538

3639
public String getTestDataPath() {
@@ -72,6 +75,13 @@ public void testFindServiceDefinitionsForPhpClassInsideXml() {
7275
));
7376
}
7477

78+
public void testFindServiceDefinitionsForPhpClassInsidePhp() {
79+
assertNotNull(ContainerUtil.find(
80+
ServiceIndexUtil.findServiceDefinitions(PhpElementsUtil.getClass(getProject(), "My\\Foo\\Service\\PhpTargets")),
81+
new MyPhpCondition("php_twig.command.debug")
82+
));
83+
}
84+
7585
public void testFindServiceDefinitionsForPhpClassAsLazyInsideYml() {
7686
assertNotNull(ContainerUtil.find(
7787
ServiceIndexUtil.findServiceDefinitionsLazy(PhpElementsUtil.getClass(getProject(),"My\\Foo\\Service\\Targets")).getValue(),
@@ -144,4 +154,18 @@ public boolean value(PsiElement psiElement) {
144154
return psiElement instanceof XmlTag && this.key.equals(((XmlTag) psiElement).getAttributeValue(this.attr));
145155
}
146156
}
157+
158+
private static class MyPhpCondition implements Condition<PsiElement> {
159+
@NotNull
160+
private final String id;
161+
162+
public MyPhpCondition(@NotNull String id) {
163+
this.id = id;
164+
}
165+
166+
@Override
167+
public boolean value(PsiElement psiElement) {
168+
return psiElement instanceof StringLiteralExpression && this.id.equalsIgnoreCase(((StringLiteralExpression) psiElement).getContents());
169+
}
170+
}
147171
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@
33
namespace My\Foo\Service
44
{
55
class Targets{}
6+
class PhpTargets{}
67
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
3+
namespace Symfony\Component\DependencyInjection\Loader\Configurator;
4+
5+
use My\Foo\Service\PhpTargets;
6+
7+
return static function (ContainerConfigurator $container) {
8+
$container->services()
9+
->set('php_twig.command.debug', PhpTargets::class)
10+
->alias('php_twig.command.debug_alias', 'php_foo_alias')
11+
;
12+
};

0 commit comments

Comments
 (0)