Skip to content

Commit cbc2d72

Browse files
slapoguzovAleksandr Slapoguzov
authored andcommitted
[support for 2020.2 version] process all class references for parameter (union types support) - now a parameter can contain several class references
[support for 2020.2 version] process all class references for parameter (union types support) - now a parameter can contain several class references fixup! [support for 2020.2 version] process all class references for parameter (union types support) - now a parameter can contain several class references
1 parent 1fea9ef commit cbc2d72

File tree

6 files changed

+57
-35
lines changed

6 files changed

+57
-35
lines changed

src/main/java/fr/adrienbrault/idea/symfony2plugin/config/yaml/inspection/EventMethodCallInspection.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@
3636
import org.jetbrains.yaml.YAMLTokenTypes;
3737
import org.jetbrains.yaml.psi.*;
3838

39+
import java.util.Collection;
40+
import java.util.stream.Collectors;
41+
3942
/**
4043
* @author Daniel Espendiller <daniel@espendiller.net>
4144
*/
@@ -199,18 +202,24 @@ private String getEventTypeHint(@NotNull ProblemDescriptor problemDescriptor, @N
199202
return null;
200203
}
201204

202-
String taggedEventMethodParameter = EventSubscriberUtil.getTaggedEventMethodParameter(problemDescriptor.getPsiElement().getProject(), eventName);
203-
if (taggedEventMethodParameter == null) {
205+
Collection<String> taggedEventMethodParameter = EventSubscriberUtil.getTaggedEventMethodParameter(problemDescriptor.getPsiElement().getProject(), eventName);
206+
if (taggedEventMethodParameter.isEmpty()) {
204207
return null;
205208
}
206209

207-
String qualifiedName = AnnotationBackportUtil.getQualifiedName(phpClass, taggedEventMethodParameter);
208-
if (qualifiedName != null && !qualifiedName.equals(StringUtils.stripStart(taggedEventMethodParameter, "\\"))) {
210+
return taggedEventMethodParameter.stream()
211+
.map(fqn -> importIfNecessary(phpClass, fqn))
212+
.collect(Collectors.joining("|"));
213+
}
214+
215+
private String importIfNecessary(@NotNull PhpClass phpClass, String fqn) {
216+
String qualifiedName = AnnotationBackportUtil.getQualifiedName(phpClass, fqn);
217+
if (qualifiedName != null && !qualifiedName.equals(StringUtils.stripStart(fqn, "\\"))) {
209218
// class already imported
210219
return qualifiedName;
211220
}
212221

213-
return PhpElementsUtil.insertUseIfNecessary(phpClass, taggedEventMethodParameter);
222+
return PhpElementsUtil.insertUseIfNecessary(phpClass, fqn);
214223
}
215224
}
216225

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

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.jetbrains.annotations.Nullable;
2222

2323
import java.util.Collection;
24+
import java.util.Collections;
2425

2526
/**
2627
* @author Daniel Espendiller <daniel@espendiller.net>
@@ -49,12 +50,12 @@ public static void visitNamedTag(@NotNull Project project, @NotNull String tagNa
4950
/**
5051
* @TODO: implement collection with prio
5152
*/
52-
@Nullable
53-
public static String getTaggedEventMethodParameter(@NotNull Project project, @NotNull String eventName) {
53+
@NotNull
54+
public static Collection<String> getTaggedEventMethodParameter(@NotNull Project project, @NotNull String eventName) {
5455

5556
// Static list
5657
if(ServiceUtil.TAGS.containsKey(eventName)) {
57-
return ServiceUtil.TAGS.get(eventName);
58+
return Collections.singletonList(ServiceUtil.TAGS.get(eventName));
5859
}
5960

6061
// @Event annotation
@@ -65,7 +66,7 @@ public static String getTaggedEventMethodParameter(@NotNull Project project, @No
6566
);
6667

6768
if(dispatcherEvent != null && StringUtils.isNotBlank(dispatcherEvent.getInstance())) {
68-
return dispatcherEvent.getInstance();
69+
return Collections.singletonList(dispatcherEvent.getInstance());
6970
}
7071

7172
// Extract from directly from EventSubscriberInterface
@@ -77,9 +78,9 @@ public static String getTaggedEventMethodParameter(@NotNull Project project, @No
7778

7879
Method method = PhpElementsUtil.getClassMethod(project, event.getFqnClassName(), methodName);
7980
if(method != null) {
80-
String methodParameterClassHint = PhpElementsUtil.getMethodParameterTypeHint(method);
81-
if(methodParameterClassHint != null) {
82-
return methodParameterClassHint;
81+
Collection<String> methodParameterClassHints = PhpElementsUtil.getMethodParameterTypeHints(method);
82+
if(!methodParameterClassHints.isEmpty()) {
83+
return methodParameterClassHints;
8384
}
8485
}
8586
}
@@ -109,9 +110,9 @@ public static String getTaggedEventMethodParameter(@NotNull Project project, @No
109110
if(phpClass != null) {
110111
Method method = phpClass.findMethodByName(methodName);
111112
if(method != null) {
112-
String methodParameterTypeHint = PhpElementsUtil.getMethodParameterTypeHint(method);
113-
if(methodParameterTypeHint != null) {
114-
return methodParameterTypeHint;
113+
Collection<String> methodParameterTypeHints = PhpElementsUtil.getMethodParameterTypeHints(method);
114+
if(!methodParameterTypeHints.isEmpty()) {
115+
return methodParameterTypeHints;
115116
}
116117
}
117118

@@ -121,6 +122,6 @@ public static String getTaggedEventMethodParameter(@NotNull Project project, @No
121122
}
122123
}
123124

124-
return null;
125+
return Collections.emptyList();
125126
}
126127
}

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

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.jetbrains.annotations.Nullable;
3434

3535
import java.util.*;
36+
import java.util.stream.Collectors;
3637

3738
/**
3839
* @author Daniel Espendiller <daniel@espendiller.net>
@@ -1013,24 +1014,23 @@ public static boolean isTestClass(@NotNull PhpClass phpClass) {
10131014
*
10141015
* function foo(\FooClass $class)
10151016
*/
1016-
@Nullable
1017-
public static String getMethodParameterTypeHint(@NotNull Method method) {
1017+
@NotNull
1018+
public static Collection<String> getMethodParameterTypeHints(@NotNull Method method) {
10181019
ParameterList childOfType = PsiTreeUtil.getChildOfType(method, ParameterList.class);
10191020
if(childOfType == null) {
1020-
return null;
1021+
return Collections.emptyList();
10211022
}
10221023

10231024
PsiElement[] parameters = childOfType.getParameters();
10241025
if(parameters.length == 0) {
1025-
return null;
1026-
}
1027-
1028-
ClassReference classReference = PsiTreeUtil.getChildOfType(parameters[0], ClassReference.class);
1029-
if(classReference == null) {
1030-
return null;
1026+
return Collections.emptyList();
10311027
}
1032-
1033-
return classReference.getFQN();
1028+
1029+
PhpTypeDeclaration typeDeclaration = PsiTreeUtil.getChildOfType(parameters[0], PhpTypeDeclaration.class);
1030+
if (typeDeclaration == null) return Collections.emptyList();
1031+
return typeDeclaration.getClassReferences().stream()
1032+
.map(PhpReference::getFQN)
1033+
.collect(Collectors.toList());
10341034
}
10351035

10361036
/**

src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/util/EventSubscriberUtilTest.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
import fr.adrienbrault.idea.symfony2plugin.tests.SymfonyLightCodeInsightFixtureTestCase;
44
import fr.adrienbrault.idea.symfony2plugin.util.EventSubscriberUtil;
55

6+
import java.util.Arrays;
7+
import java.util.Collections;
8+
69
/**
710
* @author Daniel Espendiller <daniel@espendiller.net>
811
*/
@@ -21,20 +24,21 @@ public String getTestDataPath() {
2124
* @see EventSubscriberUtil#getTaggedEventMethodParameter
2225
*/
2326
public void testGetTaggedEventMethodParameterWithInternals() {
24-
assertEquals("\\Symfony\\Component\\HttpKernel\\Event\\GetResponseEvent", EventSubscriberUtil.getTaggedEventMethodParameter(getProject(), "kernel.request"));
27+
assertEquals(Collections.singletonList("\\Symfony\\Component\\HttpKernel\\Event\\GetResponseEvent"), EventSubscriberUtil.getTaggedEventMethodParameter(getProject(), "kernel.request"));
2528
}
2629

2730
/**
2831
* @see EventSubscriberUtil#getTaggedEventMethodParameter
2932
*/
3033
public void testGetTaggedEventMethodParameterWithSubscriberInterface() {
31-
assertEquals("\\DateTime", EventSubscriberUtil.getTaggedEventMethodParameter(getProject(), "pre.foo"));
32-
assertNull(EventSubscriberUtil.getTaggedEventMethodParameter(getProject(), "pre.foo_doh"));
34+
assertEquals(Collections.singletonList("\\DateTime"), EventSubscriberUtil.getTaggedEventMethodParameter(getProject(), "pre.foo"));
35+
assertEquals(Arrays.asList("\\DateTime", "\\DateInterval"), EventSubscriberUtil.getTaggedEventMethodParameter(getProject(), "union.types"));
36+
assertEmpty(EventSubscriberUtil.getTaggedEventMethodParameter(getProject(), "pre.foo_doh"));
3337
}
3438
/**
3539
* @see EventSubscriberUtil#getTaggedEventMethodParameter
3640
*/
3741
public void testGetTaggedEventMethodParameterWithIndexEventAnnotation() {
38-
assertEquals("Foo\\Event\\MyEvent", EventSubscriberUtil.getTaggedEventMethodParameter(getProject(), "my.foo.event"));
42+
assertEquals(Collections.singletonList("Foo\\Event\\MyEvent"), EventSubscriberUtil.getTaggedEventMethodParameter(getProject(), "my.foo.event"));
3943
}
4044
}

src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/util/PhpElementsUtilTest.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@
1010
import fr.adrienbrault.idea.symfony2plugin.util.PhpElementsUtil;
1111

1212
import java.util.ArrayList;
13+
import java.util.Arrays;
1314
import java.util.Collection;
15+
import java.util.Collections;
1416

1517
/**
1618
* @author Daniel Espendiller <daniel@espendiller.net>
@@ -27,18 +29,22 @@ public String getTestDataPath() {
2729
}
2830

2931
/**
30-
* @see fr.adrienbrault.idea.symfony2plugin.util.PhpElementsUtil#getMethodParameterTypeHint
32+
* @see fr.adrienbrault.idea.symfony2plugin.util.PhpElementsUtil#getMethodParameterTypeHints
3133
*/
3234
public void testGetMethodParameterClassHint() {
33-
assertEquals("\\DateTime", PhpElementsUtil.getMethodParameterTypeHint(
35+
assertEquals(Collections.singletonList("\\DateTime"), PhpElementsUtil.getMethodParameterTypeHints(
3436
PhpPsiElementFactory.createMethod(getProject(), "function foo(\\DateTime $e) {}")
3537
));
3638

37-
assertEquals("\\Iterator", PhpElementsUtil.getMethodParameterTypeHint(
39+
assertEquals(Arrays.asList("\\DateTime", "\\DateInterval"), PhpElementsUtil.getMethodParameterTypeHints(
40+
PhpPsiElementFactory.createMethod(getProject(), "function foo(\\DateTime|\\DateInterval $e) {}")
41+
));
42+
43+
assertEquals(Collections.singletonList("\\Iterator"), PhpElementsUtil.getMethodParameterTypeHints(
3844
PhpPsiElementFactory.createMethod(getProject(), "function foo(/* foo */ \\Iterator $a, \\DateTime $b")
3945
));
4046

41-
assertNull(PhpElementsUtil.getMethodParameterTypeHint(
47+
assertEmpty(PhpElementsUtil.getMethodParameterTypeHints(
4248
PhpPsiElementFactory.createMethod(getProject(), "function foo(/* foo */ $a, \\DateTime $b")
4349
));
4450
}

src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/util/fixtures/EventSubscriber.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@ public static function getSubscribedEvents()
1919
{
2020
return array(
2121
'pre.foo' => 'preFoo',
22+
'union.types' => 'unionTypes',
2223
'kernel.request' => 'FOO',
2324
);
2425
}
2526

2627
public function preFoo(\DateTime $d) {}
28+
public function unionTypes(\DateTime|\DateInterval $d) {}
2729
}
2830
}
2931

0 commit comments

Comments
 (0)