Skip to content

Commit 3b0ba76

Browse files
authored
Merge pull request Haehnchen#1496 from Haehnchen/feature/autowrite-constructor-linemarker
provide linemarker for a constructor which supports autowire
2 parents 7f7f0b4 + 33cb015 commit 3b0ba76

File tree

3 files changed

+112
-1
lines changed

3 files changed

+112
-1
lines changed

src/main/java/fr/adrienbrault/idea/symfony2plugin/config/ServiceLineMarkerProvider.java

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.intellij.codeInsight.daemon.LineMarkerProvider;
55
import com.intellij.codeInsight.daemon.RelatedItemLineMarkerInfo;
66
import com.intellij.codeInsight.navigation.NavigationGutterIconBuilder;
7+
import com.intellij.icons.AllIcons;
78
import com.intellij.openapi.project.Project;
89
import com.intellij.openapi.util.NotNullLazyValue;
910
import com.intellij.openapi.util.Pair;
@@ -76,6 +77,10 @@ public void collectSlowLineMarkers(@NotNull List<PsiElement> psiElements, @NotNu
7677
this.constraintValidatorClassMarker(psiElement, results);
7778
}
7879

80+
if(PhpElementsUtil.getClassMethodNamePattern().accepts(psiElement)) {
81+
this.autowireConstructorMarker(psiElement, results);
82+
}
83+
7984
if(psiElement instanceof PhpFile) {
8085
routeAnnotationFileResource((PhpFile) psiElement, results);
8186
}
@@ -307,10 +312,70 @@ private void constraintValidatorClassMarker(PsiElement psiElement, Collection<Li
307312
results.add(builder.createLineMarkerInfo(psiElement));
308313
}
309314

315+
private void autowireConstructorMarker(PsiElement psiElement, Collection<LineMarkerInfo> results) {
316+
PsiElement method = psiElement.getParent();
317+
if (!(method instanceof Method)) {
318+
return;
319+
}
320+
321+
if (!"__construct".equals(((Method) method).getName())) {
322+
return;
323+
}
324+
325+
PhpClass phpClass = ((Method) method).getContainingClass();
326+
if (phpClass == null) {
327+
return;
328+
}
329+
330+
boolean isAutowire = false;
331+
332+
Pair<ClassServiceDefinitionTargetLazyValue, Collection<ContainerService>> serviceDefinitionsOfResource = ServiceIndexUtil.findServiceDefinitionsOfResourceLazy(phpClass);
333+
if (serviceDefinitionsOfResource != null) {
334+
for (ContainerService containerService : serviceDefinitionsOfResource.getSecond()) {
335+
ServiceInterface service = containerService.getService();
336+
if (service == null) {
337+
continue;
338+
}
339+
340+
if (service.isAutowire()) {
341+
isAutowire = true;
342+
break;
343+
}
344+
}
345+
}
346+
347+
// direct service
348+
if (!isAutowire) {
349+
ContainerCollectionResolver.ServiceCollector serviceCollector = ContainerCollectionResolver.ServiceCollector.create(phpClass.getProject());
350+
for (String convertClassNameToService : serviceCollector.convertClassNameToServices(phpClass.getFQN())) {
351+
ContainerService containerService = serviceCollector.getServices().get(convertClassNameToService);
352+
if (containerService == null) {
353+
continue;
354+
}
355+
356+
ServiceInterface service = containerService.getService();
357+
if (service != null && service.isAutowire()) {
358+
isAutowire = true;
359+
break;
360+
}
361+
}
362+
}
363+
364+
if (!isAutowire) {
365+
return;
366+
}
367+
368+
NavigationGutterIconBuilder<PsiElement> builder = NavigationGutterIconBuilder.create(AllIcons.Nodes.Plugin)
369+
.setTargets(new MyCollectionNotNullLazyValue(Collections.emptyList()))
370+
.setTooltipText("Symfony: <a href=\"https://symfony.com/doc/current/service_container/autowiring.html\">Autowire available</a>");
371+
372+
results.add(builder.createLineMarkerInfo(psiElement));
373+
}
374+
310375
private static class MyCollectionNotNullLazyValue extends NotNullLazyValue<Collection<? extends PsiElement>> {
311376
private final Collection<ClassServiceDefinitionTargetLazyValue> targets;
312377

313-
public MyCollectionNotNullLazyValue(Collection<ClassServiceDefinitionTargetLazyValue> targets) {
378+
public MyCollectionNotNullLazyValue(@NotNull Collection<ClassServiceDefinitionTargetLazyValue> targets) {
314379
this.targets = targets;
315380
}
316381

src/main/java/fr/adrienbrault/idea/symfony2plugin/util/PhpElementsUtil.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,20 @@ static public PsiElementPattern.Capture<PsiElement> getClassNamePattern() {
351351
.withLanguage(PhpLanguage.INSTANCE);
352352
}
353353

354+
/**
355+
* class Foo { function "test" {} }
356+
*/
357+
static public PsiElementPattern.Capture<PsiElement> getClassMethodNamePattern() {
358+
return PlatformPatterns
359+
.psiElement(PhpTokenTypes.IDENTIFIER)
360+
.afterLeafSkipping(
361+
PlatformPatterns.psiElement(PsiWhiteSpace.class),
362+
PlatformPatterns.psiElement(PhpTokenTypes.kwFUNCTION)
363+
)
364+
.withParent(Method.class)
365+
.withLanguage(PhpLanguage.INSTANCE);
366+
}
367+
354368
/**
355369
* return 'value' inside class method
356370
*/

src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/config/ServiceLineMarkerProviderTest.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,4 +207,36 @@ public void testConstraintAndValidateClassLineMarker() {
207207
"}"
208208
), new LineMarker.ToolTipEqualsAssert("Navigate to constraint"));
209209
}
210+
211+
public void testThatAutowireConstructorIsGivenALineMarker() {
212+
myFixture.configureByText(YAMLFileType.YML,
213+
"services:\n" +
214+
" Service\\YamlBar: " +
215+
" autowire: true\n\n"
216+
);
217+
218+
assertLineMarker(PhpPsiElementFactory.createPsiFileFromText(getProject(), "<?php\n" +
219+
"namespace Service {\n" +
220+
" class YamlBar {\n" +
221+
" function __construct() {}\n" +
222+
" }\n" +
223+
"}"
224+
), markerInfo -> markerInfo.getLineMarkerTooltip() != null && markerInfo.getLineMarkerTooltip().toLowerCase().contains("autowire"));
225+
226+
myFixture.configureByText(YAMLFileType.YML,
227+
"services:\n" +
228+
" _defaults:\n" +
229+
" autowire: true\n" +
230+
"" +
231+
" Service\\YamlBarDefault: ~\n"
232+
);
233+
234+
assertLineMarker(PhpPsiElementFactory.createPsiFileFromText(getProject(), "<?php\n" +
235+
"namespace Service {\n" +
236+
" class YamlBarDefault {\n" +
237+
" function __construct() {}\n" +
238+
" }\n" +
239+
"}"
240+
), markerInfo -> markerInfo.getLineMarkerTooltip() != null && markerInfo.getLineMarkerTooltip().toLowerCase().contains("autowire"));
241+
}
210242
}

0 commit comments

Comments
 (0)