Skip to content

Commit 38f888d

Browse files
committed
provide autocompletion for DIC parameters defined dynamically Haehnchen#478
1 parent a004449 commit 38f888d

File tree

4 files changed

+61
-6
lines changed

4 files changed

+61
-6
lines changed

src/fr/adrienbrault/idea/symfony2plugin/dic/ContainerParameter.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
import org.jetbrains.annotations.NotNull;
55
import org.jetbrains.annotations.Nullable;
66

7-
import java.util.Arrays;
87
import java.util.Collection;
8+
import java.util.Collections;
99

1010
public class ContainerParameter {
1111

@@ -18,8 +18,12 @@ public ContainerParameter(@NotNull String name, @Nullable String value) {
1818
this(name, value, false);
1919
}
2020

21+
public ContainerParameter(@NotNull String name, boolean isWeak) {
22+
this(name, Collections.emptyList(), isWeak);
23+
}
24+
2125
public ContainerParameter(@NotNull String name, @Nullable String value, boolean isWeak) {
22-
this(name, Arrays.asList(value), isWeak);
26+
this(name, Collections.singletonList(value), isWeak);
2327
}
2428

2529
public ContainerParameter(@NotNull String name, Collection<String> values, boolean isWeak) {

src/fr/adrienbrault/idea/symfony2plugin/stubs/ContainerCollectionResolver.java

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,17 @@
44
import com.intellij.openapi.util.Key;
55
import com.intellij.psi.search.GlobalSearchScope;
66
import com.intellij.psi.util.CachedValue;
7+
import com.intellij.util.indexing.FileBasedIndexImpl;
78
import fr.adrienbrault.idea.symfony2plugin.config.component.parser.ParameterServiceParser;
89
import fr.adrienbrault.idea.symfony2plugin.dic.ContainerParameter;
910
import fr.adrienbrault.idea.symfony2plugin.dic.ContainerService;
1011
import fr.adrienbrault.idea.symfony2plugin.dic.XmlServiceParser;
1112
import fr.adrienbrault.idea.symfony2plugin.dic.container.ServiceInterface;
13+
import fr.adrienbrault.idea.symfony2plugin.dic.container.dict.ContainerBuilderCall;
1214
import fr.adrienbrault.idea.symfony2plugin.dic.webDeployment.ServiceContainerRemoteFileStorage;
1315
import fr.adrienbrault.idea.symfony2plugin.routing.webDeployment.RoutingRemoteFileStorage;
1416
import fr.adrienbrault.idea.symfony2plugin.stubs.cache.FileIndexCaches;
17+
import fr.adrienbrault.idea.symfony2plugin.stubs.indexes.ContainerBuilderStubIndex;
1518
import fr.adrienbrault.idea.symfony2plugin.stubs.indexes.ContainerParameterStubIndex;
1619
import fr.adrienbrault.idea.symfony2plugin.stubs.indexes.ServicesDefinitionStubIndex;
1720
import fr.adrienbrault.idea.symfony2plugin.util.service.ServiceXmlParserFactory;
@@ -371,7 +374,7 @@ private Map<String, ContainerParameter> getParameters() {
371374
return this.containerParameterMap;
372375
}
373376

374-
this.containerParameterMap = new TreeMap<String, ContainerParameter>(String.CASE_INSENSITIVE_ORDER);
377+
this.containerParameterMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
375378

376379
if(this.sources.contains(Source.COMPILER)) {
377380
// local filesystem
@@ -400,6 +403,23 @@ private Map<String, ContainerParameter> getParameters() {
400403
}
401404
}
402405

406+
// setParameter("foo") for ContainerBuilder
407+
for (ContainerBuilderCall call : FileBasedIndexImpl.getInstance().getValues(ContainerBuilderStubIndex.KEY, "setParameter", GlobalSearchScope.allScope(project))) {
408+
Collection<String> parameters = call.getParameter();
409+
if(parameters == null || parameters.size() == 0) {
410+
continue;
411+
}
412+
413+
for (String parameter : parameters) {
414+
if(this.containerParameterMap.containsKey(parameter)) {
415+
continue;
416+
}
417+
418+
this.containerParameterMap.put(parameter, new ContainerParameter(parameter, true));
419+
}
420+
421+
}
422+
403423
}
404424

405425
return this.containerParameterMap;
@@ -413,7 +433,7 @@ private Set<String> getNames() {
413433
return this.containerParameterMap.keySet();
414434
}
415435

416-
Set<String> parameterNames = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
436+
Set<String> parameterNames = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
417437

418438
if(this.sources.contains(Source.COMPILER)) {
419439
// local filesystem
@@ -424,11 +444,17 @@ private Set<String> getNames() {
424444
parameterNames.addAll(
425445
FileIndexCaches.getIndexKeysCache(project, SERVICE_PARAMETER_INDEX_NAMES, ContainerParameterStubIndex.KEY)
426446
);
447+
448+
// setParameter("foo") for ContainerBuilder
449+
for (ContainerBuilderCall call : FileBasedIndexImpl.getInstance().getValues(ContainerBuilderStubIndex.KEY, "setParameter", GlobalSearchScope.allScope(project))) {
450+
Collection<String> parameter = call.getParameter();
451+
if(parameter != null) {
452+
parameterNames.addAll(parameter);
453+
}
454+
}
427455
}
428456

429457
return parameterNames;
430-
431-
432458
}
433459

434460
}

tests/fr/adrienbrault/idea/symfony2plugin/tests/stubs/ContainerCollectionResolverTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package fr.adrienbrault.idea.symfony2plugin.tests.stubs;
22

3+
import fr.adrienbrault.idea.symfony2plugin.dic.ContainerParameter;
34
import fr.adrienbrault.idea.symfony2plugin.dic.ContainerService;
45
import fr.adrienbrault.idea.symfony2plugin.stubs.ContainerCollectionResolver;
56
import fr.adrienbrault.idea.symfony2plugin.tests.SymfonyLightCodeInsightFixtureTestCase;
67
import org.jetbrains.yaml.YAMLFileType;
78

9+
import java.io.File;
810
import java.util.Set;
911

1012
/**
@@ -50,6 +52,12 @@ public void setUp() throws Exception {
5052
" foo_datetime:\n" +
5153
" class: %bar%\n"
5254
);
55+
56+
myFixture.copyFileToProject("ContainerBuilder.php");
57+
}
58+
59+
public String getTestDataPath() {
60+
return new File(this.getClass().getResource("fixtures").getFile()).getAbsolutePath();
5361
}
5462

5563
public void testCaseInsensitiveService() {
@@ -94,4 +102,11 @@ public void testThatAliasedServiceIsEqualWithMainService() {
94102
assertEquals("DateTime", ContainerCollectionResolver.getService(getProject(), "foo_as_alias").getClassName());
95103
assertEquals("DateTime", ContainerCollectionResolver.getService(getProject(), "foo").getClassName());
96104
}
105+
106+
public void testThatContainerBuilderParameterAreCollected() {
107+
assertContainsElements(ContainerCollectionResolver.getParameterNames(getProject()), "container.builder.parameter");
108+
ContainerParameter containerParameter = ContainerCollectionResolver.getParameters(getProject()).get("container.builder.parameter");
109+
assertNotNull(containerParameter);
110+
assertTrue(containerParameter.isWeak());
111+
}
97112
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
class Foo
4+
{
5+
public function process(\Symfony\Component\DependencyInjection\ContainerBuilder $c)
6+
{
7+
$c->setParameter('container.builder.parameter');
8+
}
9+
10+
}

0 commit comments

Comments
 (0)