Skip to content

Commit 3ac5bfc

Browse files
committed
- Added completion for classes/virtualtypes in DI
- Added references for virtualtypes in DI
1 parent 6d516ed commit 3ac5bfc

12 files changed

+509
-192
lines changed

META-INF/plugin.xml

+12-9
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
<idea-plugin version="2">
2-
<id>com.yourcompany.unique.plugin.id</id>
3-
<name>Plugin display name here</name>
4-
<version>1.0</version>
5-
<vendor email="support@yourcompany.com" url="http://www.yourcompany.com">YourCompany</vendor>
2+
<id>com.magento.idea.magento2plugin</id>
3+
<name>Magento2</name>
4+
<version>0.0.6</version>
5+
<vendor email="dkvashnin@ebay.com" url="http://www.magento.com">Magento</vendor>
66

77
<description><![CDATA[
8-
Enter short description for your plugin here.<br>
9-
<em>most HTML tags may be used</em>
8+
Plugin, created to improve life-work balance while working with Magento 2
109
]]></description>
1110

1211
<change-notes><![CDATA[
13-
Add change notes here.<br>
14-
<em>most HTML tags may be used</em>
12+
v0.0.5 Implemented reference support for classes/interfaces in DI configuration
13+
<br/>
14+
v0.0.6 Implemented reference and completion support for virtual types/classes in DI configuration
1515
]]>
1616
</change-notes>
1717

@@ -27,7 +27,10 @@
2727
<depends>com.intellij.modules.platform</depends>
2828

2929
<extensions defaultExtensionNs="com.intellij">
30-
<psi.referenceContributor implementation="com.magento.idea.magento2plugin.xml.reference.XmlReferenceContributor"/>
30+
<psi.referenceContributor implementation="com.magento.idea.magento2plugin.xml.di.reference.XmlReferenceContributor"/>
31+
<completion.contributor language="XML" implementationClass="com.magento.idea.magento2plugin.xml.di.completion.VirtualTypeCompletionContributor" />
32+
<completion.contributor language="XML" implementationClass="com.magento.idea.magento2plugin.xml.di.completion.ClassCompletionContributor" />
33+
<fileBasedIndex implementation="com.magento.idea.magento2plugin.xml.di.index.VirtualTypesNamesFileBasedIndex" />
3134
<!-- Add your extensions here -->
3235
</extensions>
3336

magento2plugin.iml

-9
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,6 @@
33
<component name="DevKit.ModuleBuildProperties" url="file://$MODULE_DIR$/META-INF/plugin.xml" />
44
<component name="NewModuleRootManager" inherit-compiler-output="true">
55
<exclude-output />
6-
<content url="file://$MODULE_DIR$/../idea-php-symfony2-plugin">
7-
<sourceFolder url="file://$MODULE_DIR$/../idea-php-symfony2-plugin/src" isTestSource="false" />
8-
<sourceFolder url="file://$MODULE_DIR$/../idea-php-symfony2-plugin/tests" isTestSource="false" />
9-
<excludeFolder url="file://$MODULE_DIR$/../idea-php-symfony2-plugin/META-INF" />
10-
<excludeFolder url="file://$MODULE_DIR$/../idea-php-symfony2-plugin/lib" />
11-
<excludeFolder url="file://$MODULE_DIR$/../idea-php-symfony2-plugin/out" />
12-
<excludeFolder url="file://$MODULE_DIR$/../idea-php-symfony2-plugin/src" />
13-
<excludeFolder url="file://$MODULE_DIR$/../idea-php-symfony2-plugin/tests" />
14-
</content>
156
<content url="file://$MODULE_DIR$">
167
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
178
</content>

src/com/magento/idea/magento2plugin/utils/completion/PhpClassReferenceInsertHandler.java

-39
This file was deleted.

src/com/magento/idea/magento2plugin/xml/XmlHelper.java src/com/magento/idea/magento2plugin/xml/di/XmlHelper.java

+66-39
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
package com.magento.idea.magento2plugin.xml;
1+
package com.magento.idea.magento2plugin.xml.di;
22

33
import com.intellij.patterns.*;
44
import com.intellij.psi.PsiElement;
55
import com.intellij.psi.PsiFile;
6+
import com.intellij.psi.xml.XmlAttribute;
67
import com.intellij.psi.xml.XmlTag;
78
import com.intellij.psi.xml.XmlTokenType;
89

@@ -15,24 +16,24 @@ public class XmlHelper {
1516
*/
1617
public static XmlAttributeValuePattern getDiTypePattern() {
1718
return XmlPatterns
18-
.xmlAttributeValue()
19-
.withParent(
20-
XmlPatterns
21-
.xmlAttribute("name")
22-
.withParent(
23-
XmlPatterns
24-
.xmlTag()
25-
.withName("type")
26-
)
27-
).inside(
28-
XmlHelper.getInsideTagPattern("type")
29-
).inFile(XmlHelper.getXmlFilePattern());
19+
.xmlAttributeValue()
20+
.withParent(
21+
XmlPatterns
22+
.xmlAttribute("name")
23+
.withParent(
24+
XmlPatterns
25+
.xmlTag()
26+
.withName("type")
27+
)
28+
).inside(
29+
XmlHelper.getInsideTagPattern("type")
30+
).inFile(XmlHelper.getXmlFilePattern());
3031
}
3132

3233
/**
3334
* <preference type="\Namespace\Class">
3435
*/
35-
public static XmlAttributeValuePattern getDiPreferencePattern() {
36+
public static XmlAttributeValuePattern getDiPreferenceTypePattern() {
3637
return XmlPatterns
3738
.xmlAttributeValue()
3839
.withParent(
@@ -48,6 +49,44 @@ public static XmlAttributeValuePattern getDiPreferencePattern() {
4849
).inFile(XmlHelper.getXmlFilePattern());
4950
}
5051

52+
/**
53+
* <preference for="\Namespace\Type">
54+
*/
55+
public static XmlAttributeValuePattern getDiPreferenceForPattern() {
56+
return XmlPatterns
57+
.xmlAttributeValue()
58+
.withParent(
59+
XmlPatterns
60+
.xmlAttribute("for")
61+
.withParent(
62+
XmlPatterns
63+
.xmlTag()
64+
.withName("preference")
65+
)
66+
).inside(
67+
XmlHelper.getInsideTagPattern("preference")
68+
).inFile(XmlHelper.getXmlFilePattern());
69+
}
70+
71+
/**
72+
* <virtualType type="\Namespace\Class">
73+
*/
74+
public static XmlAttributeValuePattern getDiVirtualTypePattern() {
75+
return XmlPatterns
76+
.xmlAttributeValue()
77+
.withParent(
78+
XmlPatterns
79+
.xmlAttribute("type")
80+
.withParent(
81+
XmlPatterns
82+
.xmlTag()
83+
.withName("virtualType")
84+
)
85+
).inside(
86+
XmlHelper.getInsideTagPattern("virtualType")
87+
).inFile(XmlHelper.getXmlFilePattern());
88+
}
89+
5190
/**
5291
* <argument name="argumentName" xsi:type="object">\Namespace\Class</argument>
5392
*/
@@ -82,46 +121,34 @@ public static PsiElementPattern.Capture<PsiElement> getItemObjectPattern() {
82121
).inFile(XmlHelper.getXmlFilePattern());
83122
}
84123

85-
/**
86-
* <virtualType type="\Namespace\Class">
87-
*/
88-
public static XmlAttributeValuePattern getDiVirtualTypePattern() {
89-
return XmlPatterns
90-
.xmlAttributeValue()
91-
.withParent(
92-
XmlPatterns
93-
.xmlAttribute("type")
94-
.withParent(
95-
XmlPatterns
96-
.xmlTag()
97-
.withName("virtualType")
98-
)
99-
).inside(
100-
XmlHelper.getInsideTagPattern("virtualType")
101-
).inFile(XmlHelper.getXmlFilePattern());
102-
}
103-
104124
public static PsiFilePattern.Capture<PsiFile> getXmlFilePattern() {
105125
return XmlPatterns.psiFile()
106-
.withName(XmlPatterns
107-
.string().endsWith(".xml")
108-
);
126+
.withName(XmlPatterns.string().equalTo("di.xml"));
109127
}
110128

111129
public static PsiElementPattern.Capture<XmlTag> getInsideTagPattern(String insideTagName) {
112130
return XmlPatterns.psiElement(XmlTag.class).withName(insideTagName);
113131
}
114132

115-
public static PsiElementPattern.Capture<PsiElement> getTagPattern(String... tags) {
133+
/**
134+
* <tag attributeNames="|"/>
135+
*
136+
* @param tag tagname
137+
* @param attributeNames attribute values listen for
138+
*/
139+
public static PsiElementPattern.Capture<PsiElement> getTagAttributePattern(String tag, String... attributeNames) {
116140
return XmlPatterns
117141
.psiElement()
118142
.inside(XmlPatterns
119143
.xmlAttributeValue()
120144
.inside(XmlPatterns
121145
.xmlAttribute()
122-
.withName(StandardPatterns.string().oneOfIgnoreCase(tags)
146+
.withName(StandardPatterns.string().oneOfIgnoreCase(attributeNames))
147+
.withParent(XmlPatterns
148+
.xmlTag()
149+
.withName(tag)
123150
)
124151
)
125-
);
152+
).inFile(getXmlFilePattern());
126153
}
127154
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.magento.idea.magento2plugin.xml.di.completion;
2+
3+
import com.intellij.codeInsight.completion.*;
4+
import com.intellij.codeInsight.completion.impl.CamelHumpMatcher;
5+
import com.intellij.codeInsight.lookup.LookupElementBuilder;
6+
import com.intellij.openapi.util.text.StringUtil;
7+
import com.intellij.patterns.XmlPatterns;
8+
import com.intellij.psi.PsiElement;
9+
import com.intellij.util.ProcessingContext;
10+
import com.jetbrains.php.PhpIcons;
11+
import com.jetbrains.php.PhpIndex;
12+
import com.jetbrains.php.lang.psi.elements.PhpClass;
13+
import com.magento.idea.magento2plugin.xml.di.XmlHelper;
14+
import org.jetbrains.annotations.NotNull;
15+
16+
import java.util.Collection;
17+
18+
/**
19+
* Created by dkvashnin on 10/15/15.
20+
*/
21+
public class ClassCompletionContributor extends CompletionContributor {
22+
public ClassCompletionContributor() {
23+
extend(CompletionType.BASIC,
24+
XmlPatterns.or(
25+
XmlHelper.getArgumentObjectPattern(),
26+
XmlHelper.getItemObjectPattern(),
27+
XmlHelper.getTagAttributePattern("type", "name"),
28+
XmlHelper.getTagAttributePattern("preference", "type"),
29+
XmlHelper.getTagAttributePattern("virtualType", "type")
30+
),
31+
new CompletionProvider<CompletionParameters>() {
32+
public void addCompletions(@NotNull CompletionParameters parameters,
33+
ProcessingContext context,
34+
@NotNull CompletionResultSet resultSet) {
35+
PsiElement psiElement = parameters.getOriginalPosition();
36+
PhpIndex phpIndex = PhpIndex.getInstance(psiElement.getProject());
37+
String prefix = StringUtil.unquoteString(psiElement.getText());
38+
39+
Collection<String> classNames = phpIndex.getAllClassNames(new CamelHumpMatcher(prefix));
40+
41+
for (String className: classNames) {
42+
Collection<PhpClass> classesByName = phpIndex.getClassesByName(className);
43+
for (PhpClass phpClass: classesByName) {
44+
resultSet.addElement(
45+
LookupElementBuilder
46+
.create(phpClass.getPresentableFQN())
47+
.withIcon(PhpIcons.CLASS_ICON)
48+
);
49+
}
50+
}
51+
}
52+
}
53+
);
54+
}
55+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.magento.idea.magento2plugin.xml.di.completion;
2+
3+
import com.intellij.codeInsight.completion.*;
4+
import com.intellij.codeInsight.lookup.LookupElementBuilder;
5+
import com.intellij.patterns.XmlPatterns;
6+
import com.intellij.util.ProcessingContext;
7+
import com.magento.idea.magento2plugin.xml.di.XmlHelper;
8+
import com.magento.idea.magento2plugin.xml.di.index.VirtualTypesNamesFileBasedIndex;
9+
import org.jetbrains.annotations.NotNull;
10+
11+
/**
12+
* Created by dkvashnin on 10/14/15.
13+
*/
14+
public class VirtualTypeCompletionContributor extends CompletionContributor {
15+
public VirtualTypeCompletionContributor() {
16+
extend(CompletionType.BASIC,
17+
XmlPatterns.or(
18+
XmlHelper.getArgumentObjectPattern(),
19+
XmlHelper.getItemObjectPattern()
20+
),
21+
new CompletionProvider<CompletionParameters>() {
22+
public void addCompletions(@NotNull CompletionParameters parameters,
23+
ProcessingContext context,
24+
@NotNull CompletionResultSet resultSet) {
25+
String[] allVirtualTypesNames = VirtualTypesNamesFileBasedIndex.getAllVirtualTypesNames(
26+
parameters.getOriginalPosition().getProject()
27+
);
28+
29+
for (String name: allVirtualTypesNames) {
30+
resultSet.addElement(LookupElementBuilder.create(name));
31+
}
32+
}
33+
}
34+
);
35+
}
36+
}

0 commit comments

Comments
 (0)