Skip to content

Commit f8fc247

Browse files
committed
provide service completion and references for xml alias attribute #996
1 parent 90d17b3 commit f8fc247

File tree

8 files changed

+67
-5
lines changed

8 files changed

+67
-5
lines changed

src/fr/adrienbrault/idea/symfony2plugin/completion/xml/XmlGotoCompletionRegistrar.java

+28
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@
1919
import fr.adrienbrault.idea.symfony2plugin.codeInsight.utils.GotoCompletionUtil;
2020
import fr.adrienbrault.idea.symfony2plugin.completion.DecoratedServiceCompletionProvider;
2121
import fr.adrienbrault.idea.symfony2plugin.config.xml.XmlHelper;
22+
import fr.adrienbrault.idea.symfony2plugin.dic.ServiceCompletionProvider;
2223
import fr.adrienbrault.idea.symfony2plugin.routing.RouteGotoCompletionProvider;
24+
import fr.adrienbrault.idea.symfony2plugin.stubs.ContainerCollectionResolver;
2325
import fr.adrienbrault.idea.symfony2plugin.templating.TemplateGotoCompletionRegistrar;
2426
import fr.adrienbrault.idea.symfony2plugin.util.PhpElementsUtil;
2527
import fr.adrienbrault.idea.symfony2plugin.util.completion.PhpClassCompletionProvider;
@@ -54,6 +56,12 @@ public void register(GotoCompletionRegistrarParameter registrar) {
5456
ServiceIdCompletionProvider::new
5557
);
5658

59+
// <service alias="<caret>"/>
60+
registrar.register(
61+
XmlPatterns.psiElement().withParent(XmlHelper.getServiceAliasPattern()),
62+
ServiceAliasCompletionProvider::new
63+
);
64+
5765
// <factory class="AppBundle\Trivago\ConfigFactory" method="create"/>
5866
// <factory service="foo" method="create"/>
5967
registrar.register(
@@ -141,6 +149,10 @@ public Collection<PsiElement> getPsiTargets(PsiElement element) {
141149
}
142150
}
143151

152+
/**
153+
* <service id="Foo\Bar"/>
154+
* <service id="<caret>" class="MyFoo\Foo\Apple"/>
155+
*/
144156
private static class ServiceIdCompletionProvider extends GotoCompletionProvider {
145157
private ServiceIdCompletionProvider(PsiElement element) {
146158
super(element);
@@ -183,6 +195,22 @@ public void getLookupElements(@NotNull GotoCompletionProviderLookupArguments arg
183195
}
184196
}
185197

198+
/**
199+
* <service alias="<caret>"/>
200+
*/
201+
private static class ServiceAliasCompletionProvider extends GotoCompletionProvider {
202+
private ServiceAliasCompletionProvider(PsiElement element) {
203+
super(element);
204+
}
205+
206+
@Override
207+
public void getLookupElements(@NotNull GotoCompletionProviderLookupArguments arguments) {
208+
arguments.getResultSet().addAllElements(
209+
ServiceCompletionProvider.getLookupElements(null, ContainerCollectionResolver.getServices(getProject()).values()).getLookupElements()
210+
);
211+
}
212+
}
213+
186214
private static class ServiceFactoryMethodCompletionProvider extends GotoCompletionProvider {
187215
ServiceFactoryMethodCompletionProvider(PsiElement element) {
188216
super(element);

src/fr/adrienbrault/idea/symfony2plugin/config/xml/XmlHelper.java

+16
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,22 @@ public static XmlAttributeValuePattern getArgumentServiceIdPattern() {
134134
).inFile(XmlHelper.getXmlFilePattern());
135135
}
136136

137+
/**
138+
* <service alias="Foobar" />
139+
*/
140+
public static XmlAttributeValuePattern getServiceAliasPattern() {
141+
return XmlPatterns
142+
.xmlAttributeValue()
143+
.withParent(XmlPatterns
144+
.xmlAttribute("alias")
145+
.withParent(
146+
XmlPatterns.xmlTag().withName("service")
147+
)
148+
).inside(
149+
XmlHelper.getInsideTagPattern("services")
150+
).inFile(XmlHelper.getXmlFilePattern());
151+
}
152+
137153
/**
138154
* Possible service id completion on not ready type="service" argument
139155
*

src/fr/adrienbrault/idea/symfony2plugin/config/xml/XmlReferenceContributor.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package fr.adrienbrault.idea.symfony2plugin.config.xml;
22

3+
import com.intellij.patterns.PlatformPatterns;
34
import com.intellij.patterns.XmlPatterns;
45
import com.intellij.psi.*;
56
import com.intellij.psi.xml.*;
@@ -33,8 +34,9 @@ public class XmlReferenceContributor extends PsiReferenceContributor {
3334
public void registerReferenceProviders(PsiReferenceRegistrar registrar) {
3435

3536
// <argument type="service" id="service_container" />
37+
// <service alias="Foobar" />
3638
registrar.registerReferenceProvider(
37-
XmlHelper.getArgumentServiceIdPattern(),
39+
PlatformPatterns.or(XmlHelper.getArgumentServiceIdPattern(), XmlHelper.getServiceAliasPattern()),
3840
new ServiceReferenceProvider()
3941
);
4042

src/fr/adrienbrault/idea/symfony2plugin/config/xml/inspection/XmlServiceArgumentInspection.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ private static class MyPsiElementVisitor extends PsiElementVisitor {
3838
private final ProblemsHolder holder;
3939
private ContainerCollectionResolver.LazyServiceCollector lazyServiceCollector;
4040

41-
public MyPsiElementVisitor(@NotNull ProblemsHolder holder) {
41+
MyPsiElementVisitor(@NotNull ProblemsHolder holder) {
4242
this.holder = holder;
4343
}
4444

src/fr/adrienbrault/idea/symfony2plugin/intentions/yaml/YamlServiceArgumentInspection.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public class YamlServiceArgumentInspection extends LocalInspectionTool {
2727
public static final String[] INVALID_KEYS = new String[]{
2828
"parent", "factory_class", "factory_service",
2929
"factory_method", "abstract", "factory",
30-
"resource", "exclude"
30+
"resource", "exclude", "alias"
3131
};
3232

3333
@NotNull

tests/fr/adrienbrault/idea/symfony2plugin/tests/SymfonyLightCodeInsightFixtureTestCase.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -638,8 +638,8 @@ private void assertReferences(@NotNull ElementPattern<?> pattern, PsiElement psi
638638
}
639639

640640
// multiResolve support
641-
if(element instanceof PsiPolyVariantReference) {
642-
for (ResolveResult resolveResult : ((PsiPolyVariantReference) element).multiResolve(true)) {
641+
if(reference instanceof PsiPolyVariantReference) {
642+
for (ResolveResult resolveResult : ((PsiPolyVariantReference) reference).multiResolve(true)) {
643643
if (pattern.accepts(resolveResult.getElement())) {
644644
return;
645645
}

tests/fr/adrienbrault/idea/symfony2plugin/tests/action/ServiceActionUtilTest.java

+8
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,14 @@ public void testThatAutowireForServiceBlocksInspect() {
2121
assertFalse(ServiceActionUtil.isValidXmlParameterInspectionService(xmlTag));
2222
}
2323

24+
public void testThatAliasAttributeBlocksInspect() {
25+
XmlTag xmlTag = createServiceXmlTag(
26+
"<services><serv<caret>ice id=\"Foobar\" alias=\"Test\"/></services>"
27+
);
28+
29+
assertFalse(ServiceActionUtil.isValidXmlParameterInspectionService(xmlTag));
30+
}
31+
2432
public void testThatDefaultValueIsOverwriteInService() {
2533
XmlTag xmlTag = createServiceXmlTag(
2634
" <services>\n" +

tests/fr/adrienbrault/idea/symfony2plugin/tests/completion/xml/XmlGotoCompletionRegistrarTest.java

+8
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,14 @@ public void testIdInsideServiceTagMustCompleteWithClassNameOnShortcut() {
6868
);
6969
}
7070

71+
public void testThatServiceAliasAttributeMustProvideCompletion() {
72+
assertCompletionContains(
73+
XmlFileType.INSTANCE,
74+
"<services><service alias=\"<caret>\"></services>",
75+
"foo.bar_factory"
76+
);
77+
}
78+
7179
public void testThatServiceFactoryMethodAttributeProvidesCompletion() {
7280
assertCompletionContains(XmlFileType.INSTANCE, "" +
7381
"<?xml version=\"1.0\"?>\n" +

0 commit comments

Comments
 (0)