Skip to content

Commit 3849bbf

Browse files
committed
Plugin Improvements
- Added JavaScript reference contributor - General reference/completion improvements - Support all XML files (*.xml) - Added project detector - Move configuration seption to "Languages & Frameworks > Php > Magento" - Remove deprecated elements
1 parent 06666b5 commit 3849bbf

File tree

123 files changed

+3229
-3789
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

123 files changed

+3229
-3789
lines changed

META-INF/plugin.xml

+43-38
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
<idea-plugin version="2">
1+
<idea-plugin>
22
<id>com.magento.idea.magento2plugin</id>
3-
<name>Magento2</name>
3+
<name>Magento PhpStorm</name>
44
<version>0.2.2</version>
55
<vendor email="dkvashnin@magento.com" url="https://github.com/dkvashninbay/magento2plugin">Dmytro Kvashnin</vendor>
66

@@ -96,14 +96,15 @@
9696
</change-notes>
9797

9898
<!-- please see http://confluence.jetbrains.com/display/IDEADEV/Build+Number+Ranges for description -->
99-
<idea-version since-build="139"/>
99+
<idea-version since-build="172"/>
100100

101101
<!-- please see http://confluence.jetbrains.com/display/IDEADEV/Plugin+Compatibility+with+IntelliJ+Platform+Products
102102
on how to target different products -->
103103
<!-- uncomment to enable plugin in all products
104104
<depends>com.intellij.modules.lang</depends>
105105
-->
106106
<depends>com.jetbrains.php</depends>
107+
<depends>JavaScript</depends>
107108
<depends>com.intellij.modules.platform</depends>
108109

109110
<extensions defaultExtensionNs="com.intellij">
@@ -114,46 +115,50 @@
114115
secondary="false"
115116
factoryClass="com.magento.idea.magento2plugin.php.tool.ModuleToolWindowFactory" />
116117
-->
117-
<projectConfigurable instance="com.magento.idea.magento2plugin.SettingsForm" id="Magento2.SettingsForm" displayName="Magento2 Plugin"/>
118-
<projectService serviceImplementation="com.magento.idea.magento2plugin.Settings"/>
119-
120-
<psi.referenceContributor implementation="com.magento.idea.magento2plugin.xml.di.reference.DiReferenceContributor"/>
121-
<psi.referenceContributor implementation="com.magento.idea.magento2plugin.xml.observer.reference.ObserverReferenceContributor"/>
122-
<psi.referenceContributor implementation="com.magento.idea.magento2plugin.xml.observer.reference.EventReferenceContributor"/>
123-
<psi.referenceContributor implementation="com.magento.idea.magento2plugin.xml.layout.reference.LayoutReferenceContributor"/>
124-
<psi.referenceContributor implementation="com.magento.idea.magento2plugin.xml.webapi.reference.ServiceReferenceContributor"/>
125-
126-
<completion.contributor language="XML" implementationClass="com.magento.idea.magento2plugin.xml.di.completion.DiCompletionContributor" />
127-
<completion.contributor language="XML" implementationClass="com.magento.idea.magento2plugin.xml.webapi.completion.WebApiCompletionContributor" />
128-
<completion.contributor language="XML" implementationClass="com.magento.idea.magento2plugin.xml.observer.completion.EventCompletionContributor" />
129-
<completion.contributor language="XML" implementationClass="com.magento.idea.magento2plugin.xml.layout.completion.LayoutCompletionContributor" />
130-
131-
<fileBasedIndex implementation="com.magento.idea.magento2plugin.xml.di.index.VirtualTypesNamesFileBasedIndex" />
132-
<fileBasedIndex implementation="com.magento.idea.magento2plugin.xml.observer.index.EventObserverFileBasedIndex" />
133-
<fileBasedIndex implementation="com.magento.idea.magento2plugin.xml.observer.index.EventsDeclarationsFileBasedIndex" />
134-
<fileBasedIndex implementation="com.magento.idea.magento2plugin.xml.di.index.PluginToTypeFileBasedIndex" />
135-
<fileBasedIndex implementation="com.magento.idea.magento2plugin.xml.di.index.TypeConfigurationFileBasedIndex" />
136-
<fileBasedIndex implementation="com.magento.idea.magento2plugin.xml.layout.index.BlockFileBasedIndex" />
137-
<fileBasedIndex implementation="com.magento.idea.magento2plugin.xml.layout.index.ContainerFileBasedIndex" />
138-
<fileBasedIndex implementation="com.magento.idea.magento2plugin.xml.layout.index.BlockClassFileBasedIndex" />
139-
<fileBasedIndex implementation="com.magento.idea.magento2plugin.xml.webapi.index.WebApiTypesFileBasedIndex" />
140-
<fileBasedIndex implementation="com.magento.idea.magento2plugin.php.index.ModulePackageFileBasedIndex" />
118+
<projectConfigurable instance="com.magento.idea.magento2plugin.project.SettingsForm"
119+
id="Magento2.SettingsForm"
120+
displayName="Magento"
121+
nonDefaultProject="true"
122+
groupId="language"
123+
parentId="reference.webide.settings.project.settings.php"
124+
/>
125+
<projectService serviceImplementation="com.magento.idea.magento2plugin.project.Settings"/>
126+
127+
<completion.contributor language="XML" implementationClass="com.magento.idea.magento2plugin.completion.xml.XmlCompletionContributor" />
128+
129+
<psi.referenceContributor language="XML" implementation="com.magento.idea.magento2plugin.reference.xml.XmlReferenceContributor"/>
130+
<psi.referenceContributor language="PHP" implementation="com.magento.idea.magento2plugin.reference.php.PhpReferenceContributor"/>
131+
<psi.referenceContributor language="JavaScript" implementation="com.magento.idea.magento2plugin.reference.js.JsReferenceContributor"/>
132+
133+
134+
<fileBasedIndex implementation="com.magento.idea.magento2plugin.stubs.indexes.EventObserverIndex" />
135+
<fileBasedIndex implementation="com.magento.idea.magento2plugin.stubs.indexes.EventNameIndex" />
136+
<fileBasedIndex implementation="com.magento.idea.magento2plugin.stubs.indexes.TypeConfigurationIndex" />
137+
<fileBasedIndex implementation="com.magento.idea.magento2plugin.stubs.indexes.VirtualTypeIndex" />
138+
<fileBasedIndex implementation="com.magento.idea.magento2plugin.stubs.indexes.PluginIndex" />
139+
<fileBasedIndex implementation="com.magento.idea.magento2plugin.stubs.indexes.BlockNameIndex" />
140+
<fileBasedIndex implementation="com.magento.idea.magento2plugin.stubs.indexes.ContainerNameIndex" />
141+
<fileBasedIndex implementation="com.magento.idea.magento2plugin.stubs.indexes.BlockClassNameIndex" />
142+
<fileBasedIndex implementation="com.magento.idea.magento2plugin.stubs.indexes.WebApiTypeIndex" />
143+
<fileBasedIndex implementation="com.magento.idea.magento2plugin.stubs.indexes.ModulePackageIndex" />
144+
<fileBasedIndex implementation="com.magento.idea.magento2plugin.stubs.indexes.ModuleNameIndex" />
141145

142146
<codeInsight.lineMarkerProvider language="PHP" implementationClass="com.magento.idea.magento2plugin.php.linemarker.PluginLineMarkerProvider"/>
143147
<codeInsight.lineMarkerProvider language="PHP" implementationClass="com.magento.idea.magento2plugin.php.linemarker.ClassConfigurationLineMarkerProvider"/>
144148
<codeInsight.lineMarkerProvider language="PHP" implementationClass="com.magento.idea.magento2plugin.php.linemarker.WebApiLineMarkerProvider"/>
145149

146-
<localInspection language="PHP" shortName="MagentoApiInspection" displayName="Module API"
147-
groupPath="Magento2"
148-
groupName="Module Integrity"
149-
enabledByDefault="true"
150-
level="WARNING" implementationClass="com.magento.idea.magento2plugin.php.inspections.MagentoApiInspection"/>
151-
<localInspection language="PHP" shortName="ObjectManagerInspection" displayName="ObjectManager usage"
152-
groupPath="Magento2"
153-
groupName="Module Integrity"
154-
enabledByDefault="true"
155-
level="WARNING" implementationClass="com.magento.idea.magento2plugin.php.inspections.ObjectManagerInspection"/>
150+
<!--<localInspection language="PHP" shortName="MagentoApiInspection" displayName="Module API"-->
151+
<!--groupPath="Magento2"-->
152+
<!--groupName="Module Integrity"-->
153+
<!--enabledByDefault="true"-->
154+
<!--level="WARNING" implementationClass="com.magento.idea.magento2plugin.php.inspections.MagentoApiInspection"/>-->
155+
<!--<localInspection language="PHP" shortName="ObjectManagerInspection" displayName="ObjectManager usage"-->
156+
<!--groupPath="Magento2"-->
157+
<!--groupName="Module Integrity"-->
158+
<!--enabledByDefault="true"-->
159+
<!--level="WARNING" implementationClass="com.magento.idea.magento2plugin.php.inspections.ObjectManagerInspection"/>-->
156160
<!-- Add your extensions here -->
161+
<directoryProjectConfigurator implementation="com.magento.idea.magento2plugin.project.ProjectDetector"/>
157162
</extensions>
158163

159164
<application-components>
@@ -168,4 +173,4 @@
168173
<!-- Add your actions here -->
169174
</actions>
170175

171-
</idea-plugin>
176+
</idea-plugin>

magento2plugin.iml

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
</content>
1010
<orderEntry type="inheritedJdk" />
1111
<orderEntry type="sourceFolder" forTests="false" />
12-
<orderEntry type="library" scope="PROVIDED" name="php" level="project" />
1312
<orderEntry type="library" scope="PROVIDED" name="php-openapi" level="project" />
13+
<orderEntry type="library" scope="PROVIDED" name="javascript-openapi" level="project" />
1414
</component>
1515
</module>

src/com/magento/idea/magento2plugin/Magento2Icons.java

-15
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.magento.idea.magento2plugin;
2+
3+
import com.intellij.openapi.util.IconLoader;
4+
5+
import javax.swing.*;
6+
7+
/**
8+
* Created by dkvashnin on 11/14/15.
9+
*/
10+
public class MagentoIcons {
11+
public static final Icon WEB_API = IconLoader.getIcon("icons/webapi.png");
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
package com.magento.idea.magento2plugin.completion.xml;
2+
3+
import com.intellij.codeInsight.completion.CompletionContributor;
4+
import com.intellij.codeInsight.completion.CompletionType;
5+
import com.intellij.patterns.XmlPatterns;
6+
import com.intellij.psi.xml.XmlTokenType;
7+
import com.magento.idea.magento2plugin.completion.xml.provider.*;
8+
import com.magento.idea.magento2plugin.php.util.PhpRegex;
9+
10+
import static com.intellij.patterns.PlatformPatterns.psiElement;
11+
import static com.intellij.patterns.StandardPatterns.string;
12+
import static com.intellij.patterns.XmlPatterns.xmlFile;
13+
14+
public class XmlCompletionContributor extends CompletionContributor {
15+
16+
public XmlCompletionContributor() {
17+
extend(CompletionType.BASIC, psiElement(XmlTokenType.XML_ATTRIBUTE_VALUE_TOKEN)
18+
.withText(string().matches(PhpRegex.Xml.CLASS_ELEMENT)),
19+
new CompositeCompletionProvider(
20+
new PhpClassCompletionProvider(),
21+
new PhpClassMemberCompletionProvider()
22+
)
23+
);
24+
25+
extend(CompletionType.BASIC, psiElement(XmlTokenType.XML_DATA_CHARACTERS)
26+
.withText(string().matches(PhpRegex.Xml.CLASS_ELEMENT)),
27+
new CompositeCompletionProvider(
28+
new PhpClassCompletionProvider(),
29+
new PhpClassMemberCompletionProvider()
30+
)
31+
);
32+
33+
extend(CompletionType.BASIC, psiElement(XmlTokenType.XML_ATTRIBUTE_VALUE_TOKEN)
34+
.inside(XmlPatterns.xmlAttribute().withName("type")),
35+
new VirtualTypeCompletionProvider()
36+
);
37+
extend(CompletionType.BASIC, psiElement(XmlTokenType.XML_ATTRIBUTE_VALUE_TOKEN)
38+
.inside(XmlPatterns.xmlAttribute().withName("name")
39+
.withParent(XmlPatterns.xmlTag().withName("virtualType"))),
40+
new VirtualTypeCompletionProvider()
41+
);
42+
extend(CompletionType.BASIC, psiElement(XmlTokenType.XML_DATA_CHARACTERS)
43+
.withParent(XmlPatterns.xmlText().withParent(XmlPatterns.xmlTag().withChild(
44+
XmlPatterns.xmlAttribute().withName("xsi:type").withValue(string().oneOf("object"))))
45+
),
46+
new VirtualTypeCompletionProvider()
47+
);
48+
49+
// <argument name="parameterName">
50+
extend(CompletionType.BASIC, psiElement(XmlTokenType.XML_ATTRIBUTE_VALUE_TOKEN)
51+
.inside(XmlPatterns.xmlAttribute().withName("name")
52+
.withParent(XmlPatterns.xmlTag().withName("argument")
53+
.withParent(XmlPatterns.xmlTag().withName("arguments"))
54+
)
55+
).inFile(xmlFile().withName(string().endsWith("di.xml"))),
56+
new PhpConstructorArgumentCompletionProvider()
57+
);
58+
59+
// <service method="methodName"/>
60+
extend(CompletionType.BASIC, psiElement(XmlTokenType.XML_ATTRIBUTE_VALUE_TOKEN)
61+
.inside(XmlPatterns.xmlAttribute().withName("method")
62+
.withParent(XmlPatterns.xmlTag().withName("service"))
63+
).inFile(xmlFile().withName(string().endsWith("webapi.xml"))),
64+
new PhpServiceMethodCompletionContributor()
65+
);
66+
67+
extend(CompletionType.BASIC, psiElement(XmlTokenType.XML_ATTRIBUTE_VALUE_TOKEN)
68+
.inside(XmlPatterns.xmlAttribute().withName("name")
69+
.withParent(XmlPatterns.xmlTag().withName("referenceContainer"))
70+
),
71+
new LayoutContainerCompletionContributor()
72+
);
73+
74+
extend(CompletionType.BASIC, XmlPatterns.or(
75+
psiElement(XmlTokenType.XML_ATTRIBUTE_VALUE_TOKEN).inside(XmlPatterns.xmlAttribute().withName("name")
76+
.withParent(XmlPatterns.xmlTag().withName("referenceBlock"))),
77+
psiElement(XmlTokenType.XML_ATTRIBUTE_VALUE_TOKEN).inside(XmlPatterns.xmlAttribute()
78+
.withName(string().oneOf("before", "after"))
79+
.withParent(XmlPatterns.xmlTag().withName("block"))),
80+
psiElement(XmlTokenType.XML_ATTRIBUTE_VALUE_TOKEN).inside(XmlPatterns.xmlAttribute()
81+
.withName(string().oneOf("before", "after", "destination", "element"))
82+
.withParent(XmlPatterns.xmlTag().withName("move"))),
83+
psiElement(XmlTokenType.XML_ATTRIBUTE_VALUE_TOKEN).inside(XmlPatterns.xmlAttribute().withName("name")
84+
.withParent(XmlPatterns.xmlTag().withName("remove")))
85+
),
86+
new LayoutBlockCompletionContributor()
87+
);
88+
89+
extend(CompletionType.BASIC, psiElement(XmlTokenType.XML_ATTRIBUTE_VALUE_TOKEN)
90+
.inside(XmlPatterns.xmlAttribute().withName("handle")
91+
.withParent(XmlPatterns.xmlTag().withName("update"))
92+
),
93+
new LayoutUpdateCompletionContributor()
94+
);
95+
96+
// event name completion contributor
97+
extend(CompletionType.BASIC, psiElement(XmlTokenType.XML_ATTRIBUTE_VALUE_TOKEN)
98+
.inside(XmlPatterns.xmlAttribute().withName("name")
99+
.withParent(XmlPatterns.xmlTag().withName("event"))
100+
).inFile(xmlFile().withName(string().endsWith("events.xml"))),
101+
new EventNameCompletionContributor()
102+
);
103+
}
104+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.magento.idea.magento2plugin.completion.xml.provider;
2+
3+
import com.intellij.codeInsight.completion.CompletionParameters;
4+
import com.intellij.codeInsight.completion.CompletionProvider;
5+
import com.intellij.codeInsight.completion.CompletionResultSet;
6+
import com.intellij.util.ProcessingContext;
7+
import org.jetbrains.annotations.NotNull;
8+
9+
public class CompositeCompletionProvider extends CompletionProvider<CompletionParameters> {
10+
11+
private CompletionProvider<CompletionParameters>[] providers = null;
12+
13+
@SafeVarargs
14+
public CompositeCompletionProvider(CompletionProvider<CompletionParameters> ...providers) {
15+
this.providers = providers;
16+
}
17+
18+
@Override
19+
protected void addCompletions(@NotNull CompletionParameters parameters,
20+
ProcessingContext context,
21+
@NotNull CompletionResultSet result) {
22+
for (CompletionProvider<CompletionParameters> provider : providers) {
23+
provider.addCompletionVariants(parameters, context, result);
24+
}
25+
}
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.magento.idea.magento2plugin.completion.xml.provider;
2+
3+
import com.intellij.codeInsight.completion.CompletionParameters;
4+
import com.intellij.codeInsight.completion.CompletionProvider;
5+
import com.intellij.codeInsight.completion.CompletionResultSet;
6+
import com.intellij.codeInsight.lookup.LookupElementBuilder;
7+
import com.intellij.psi.PsiElement;
8+
import com.intellij.util.ProcessingContext;
9+
import com.intellij.util.indexing.FileBasedIndex;
10+
import com.magento.idea.magento2plugin.stubs.indexes.EventNameIndex;
11+
import org.jetbrains.annotations.NotNull;
12+
13+
import java.util.Collection;
14+
15+
public class EventNameCompletionContributor extends CompletionProvider<CompletionParameters> {
16+
17+
@Override
18+
protected void addCompletions(@NotNull CompletionParameters parameters,
19+
ProcessingContext context,
20+
@NotNull CompletionResultSet result) {
21+
PsiElement position = parameters.getPosition().getOriginalElement();
22+
23+
Collection<String> eventNames = FileBasedIndex.getInstance()
24+
.getAllKeys(EventNameIndex.KEY, position.getProject());
25+
26+
for (String eventName: eventNames) {
27+
result.addElement(LookupElementBuilder.create(eventName));
28+
}
29+
}
30+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.magento.idea.magento2plugin.completion.xml.provider;
2+
3+
import com.intellij.codeInsight.completion.CompletionParameters;
4+
import com.intellij.codeInsight.completion.CompletionProvider;
5+
import com.intellij.codeInsight.completion.CompletionResultSet;
6+
import com.intellij.codeInsight.lookup.LookupElementBuilder;
7+
import com.intellij.psi.PsiElement;
8+
import com.intellij.util.ProcessingContext;
9+
import com.jetbrains.php.PhpIcons;
10+
import com.magento.idea.magento2plugin.indexes.LayoutIndex;
11+
import com.magento.idea.magento2plugin.stubs.indexes.BlockNameIndex;
12+
import org.jetbrains.annotations.NotNull;
13+
14+
import java.util.Collection;
15+
16+
public class LayoutBlockCompletionContributor extends CompletionProvider<CompletionParameters> {
17+
18+
@Override
19+
protected void addCompletions(@NotNull CompletionParameters parameters,
20+
ProcessingContext context,
21+
@NotNull CompletionResultSet result) {
22+
PsiElement position = parameters.getPosition().getOriginalElement();
23+
if (position == null) {
24+
return;
25+
}
26+
27+
Collection<String> keys = LayoutIndex.getAllKeys(BlockNameIndex.KEY, position.getProject());
28+
for (String key: keys) {
29+
result.addElement(
30+
LookupElementBuilder.create(key).withIcon(PhpIcons.XML_TAG_ICON)
31+
);
32+
}
33+
}
34+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.magento.idea.magento2plugin.completion.xml.provider;
2+
3+
import com.intellij.codeInsight.completion.CompletionParameters;
4+
import com.intellij.codeInsight.completion.CompletionProvider;
5+
import com.intellij.codeInsight.completion.CompletionResultSet;
6+
import com.intellij.codeInsight.lookup.LookupElementBuilder;
7+
import com.intellij.psi.PsiElement;
8+
import com.intellij.util.ProcessingContext;
9+
import com.jetbrains.php.PhpIcons;
10+
import com.magento.idea.magento2plugin.indexes.LayoutIndex;
11+
import com.magento.idea.magento2plugin.stubs.indexes.ContainerNameIndex;
12+
import org.jetbrains.annotations.NotNull;
13+
14+
import java.util.Collection;
15+
16+
public class LayoutContainerCompletionContributor extends CompletionProvider<CompletionParameters> {
17+
18+
@Override
19+
protected void addCompletions(@NotNull CompletionParameters parameters,
20+
ProcessingContext context,
21+
@NotNull CompletionResultSet result) {
22+
PsiElement position = parameters.getPosition().getOriginalElement();
23+
if (position == null) {
24+
return;
25+
}
26+
27+
Collection<String> keys = LayoutIndex.getAllKeys(ContainerNameIndex.KEY, position.getProject());
28+
for (String key: keys) {
29+
result.addElement(
30+
LookupElementBuilder.create(key).withIcon(PhpIcons.XML_TAG_ICON)
31+
);
32+
}
33+
}
34+
}

0 commit comments

Comments
 (0)