5
5
import com .intellij .patterns .XmlPatterns ;
6
6
import com .intellij .psi .PsiElement ;
7
7
import com .intellij .psi .PsiFile ;
8
+ import com .intellij .psi .PsiReference ;
9
+ import com .intellij .psi .util .PsiTreeUtil ;
8
10
import com .intellij .psi .xml .XmlAttribute ;
9
11
import com .intellij .psi .xml .XmlAttributeValue ;
10
12
import com .intellij .psi .xml .XmlTag ;
11
13
import com .intellij .psi .xml .XmlToken ;
14
+ import com .intellij .util .containers .ContainerUtil ;
15
+ import com .jetbrains .php .completion .PhpLookupElement ;
16
+ import com .jetbrains .php .lang .psi .elements .Method ;
17
+ import com .jetbrains .php .lang .psi .elements .PhpClass ;
12
18
import fr .adrienbrault .idea .symfony2plugin .Symfony2Icons ;
19
+ import fr .adrienbrault .idea .symfony2plugin .Symfony2ProjectComponent ;
13
20
import fr .adrienbrault .idea .symfony2plugin .codeInsight .GotoCompletionProvider ;
14
21
import fr .adrienbrault .idea .symfony2plugin .codeInsight .GotoCompletionRegistrar ;
15
22
import fr .adrienbrault .idea .symfony2plugin .codeInsight .GotoCompletionRegistrarParameter ;
16
23
import fr .adrienbrault .idea .symfony2plugin .codeInsight .utils .GotoCompletionUtil ;
17
24
import fr .adrienbrault .idea .symfony2plugin .config .xml .XmlHelper ;
25
+ import fr .adrienbrault .idea .symfony2plugin .util .PhpElementsUtil ;
18
26
import fr .adrienbrault .idea .symfony2plugin .util .dict .ServiceUtil ;
19
27
import fr .adrienbrault .idea .symfony2plugin .util .resource .FileResourceUtil ;
20
28
import org .apache .commons .lang .StringUtils ;
21
29
import org .jetbrains .annotations .NotNull ;
30
+ import org .jetbrains .annotations .Nullable ;
22
31
23
32
import java .util .ArrayList ;
24
33
import java .util .Collection ;
25
34
import java .util .Collections ;
35
+ import java .util .stream .Collectors ;
26
36
27
37
public class XmlGotoCompletionRegistrar implements GotoCompletionRegistrar {
28
38
@@ -39,6 +49,15 @@ public void register(GotoCompletionRegistrarParameter registrar) {
39
49
XmlPatterns .psiElement ().withParent (XmlHelper .getServiceIdNamePattern ()),
40
50
ServiceIdCompletionProvider ::new
41
51
);
52
+
53
+ // <factory class="AppBundle\Trivago\ConfigFactory" method="create"/>
54
+ // <factory service="foo" method="create"/>
55
+ registrar .register (
56
+ XmlPatterns .psiElement ().withParent (XmlHelper .getTagAttributePattern ("factory" , "method" )
57
+ .inside (XmlHelper .getInsideTagPattern ("services" ))
58
+ .inFile (XmlHelper .getXmlFilePattern ())),
59
+ ServiceFactoryMethodCompletionProvider ::new
60
+ );
42
61
}
43
62
44
63
private static class ImportResourceGotoCompletionProvider extends GotoCompletionProvider {
@@ -114,4 +133,41 @@ public Collection<PsiElement> getPsiTargets(PsiElement element) {
114
133
return Collections .emptyList ();
115
134
}
116
135
}
136
+
137
+ private static class ServiceFactoryMethodCompletionProvider extends GotoCompletionProvider {
138
+ ServiceFactoryMethodCompletionProvider (PsiElement element ) {
139
+ super (element );
140
+ }
141
+
142
+ @ NotNull
143
+ @ Override
144
+ public Collection <LookupElement > getLookupElements () {
145
+ PsiElement parent = getElement ().getParent ();
146
+ if (!(parent instanceof XmlAttributeValue )) {
147
+ return Collections .emptyList ();
148
+ }
149
+
150
+ Collection <PhpClass > phpClasses = new ArrayList <>();
151
+
152
+ ContainerUtil .addIfNotNull (phpClasses , XmlHelper .getPhpClassForClassFactory ((XmlAttributeValue ) parent ));
153
+ ContainerUtil .addIfNotNull (phpClasses , XmlHelper .getPhpClassForServiceFactory ((XmlAttributeValue ) parent ));
154
+
155
+ Collection <LookupElement > lookupElements = new ArrayList <>();
156
+
157
+ for (PhpClass phpClass : phpClasses ) {
158
+ lookupElements .addAll (PhpElementsUtil .getClassPublicMethod (phpClass ).stream ()
159
+ .map (PhpLookupElement ::new )
160
+ .collect (Collectors .toList ())
161
+ );
162
+ }
163
+
164
+ return lookupElements ;
165
+ }
166
+
167
+ @ NotNull
168
+ @ Override
169
+ public Collection <PsiElement > getPsiTargets (PsiElement element ) {
170
+ return Collections .emptyList ();
171
+ }
172
+ }
117
173
}
0 commit comments