Skip to content

Commit d927d17

Browse files
committedDec 20, 2015
Added reference resolver for services webapi xml configurations
1 parent 13fb080 commit d927d17

File tree

5 files changed

+152
-1
lines changed

5 files changed

+152
-1
lines changed
 

‎META-INF/plugin.xml

+1
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
<psi.referenceContributor implementation="com.magento.idea.magento2plugin.xml.observer.reference.ObserverReferenceContributor"/>
7171
<psi.referenceContributor implementation="com.magento.idea.magento2plugin.xml.observer.reference.EventReferenceContributor"/>
7272
<psi.referenceContributor implementation="com.magento.idea.magento2plugin.xml.layout.reference.LayoutReferenceContributor"/>
73+
<psi.referenceContributor implementation="com.magento.idea.magento2plugin.xml.webapi.reference.ServiceReferenceContributor"/>
7374

7475
<completion.contributor language="XML" implementationClass="com.magento.idea.magento2plugin.xml.di.completion.DiCompletionContributor" />
7576
<completion.contributor language="XML" implementationClass="com.magento.idea.magento2plugin.xml.observer.completion.EventCompletionContributor" />

‎magento2plugin.iml

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<content url="file://$MODULE_DIR$">
77
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
88
</content>
9-
<orderEntry type="inheritedJdk" />
9+
<orderEntry type="jdk" jdkName="PhpStorm PS-141.2462" jdkType="IDEA JDK" />
1010
<orderEntry type="sourceFolder" forTests="false" />
1111
<orderEntry type="library" scope="PROVIDED" name="php" level="project" />
1212
<orderEntry type="library" scope="PROVIDED" name="php-openapi" level="project" />
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.magento.idea.magento2plugin.xml.webapi;
2+
3+
import com.intellij.patterns.XmlAttributeValuePattern;
4+
import com.magento.idea.magento2plugin.xml.XmlHelperUtility;
5+
6+
/**
7+
* Created by isentiabov on 20.12.2015.
8+
*/
9+
public class XmlHelper extends XmlHelperUtility {
10+
public static final String FILE_TYPE = "webapi";
11+
public static final String SERVICE_TAG = "service";
12+
public static final String METHOD_ATTRIBUTE = "method";
13+
public static final String CLASS_ATTRIBUTE = "class";
14+
15+
/**
16+
* <service method="MethodName">
17+
*/
18+
public static XmlAttributeValuePattern getMethodAttributePattern() {
19+
return getTagAttributeValuePattern(SERVICE_TAG, METHOD_ATTRIBUTE, FILE_TYPE);
20+
}
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.magento.idea.magento2plugin.xml.webapi.reference;
2+
3+
import com.intellij.patterns.XmlAttributeValuePattern;
4+
import com.intellij.psi.PsiReferenceContributor;
5+
import com.intellij.psi.PsiReferenceRegistrar;
6+
import com.magento.idea.magento2plugin.xml.di.reference.provider.XmlReferenceProvider;
7+
import com.magento.idea.magento2plugin.xml.reference.util.InterfacesResultsFiller;
8+
import com.magento.idea.magento2plugin.xml.reference.util.ReferenceResultsFiller;
9+
import com.magento.idea.magento2plugin.xml.webapi.XmlHelper;
10+
import com.magento.idea.magento2plugin.xml.webapi.reference.fill.ServiceMethodResultsFiller;
11+
import org.jetbrains.annotations.NotNull;
12+
13+
/**
14+
* Created by isentiabov on 20.12.2015.
15+
*/
16+
public class ServiceReferenceContributor extends PsiReferenceContributor{
17+
@Override
18+
public void registerReferenceProviders(@NotNull PsiReferenceRegistrar psiReferenceRegistrar) {
19+
// <service class="\Namespace\Interface" />
20+
XmlAttributeValuePattern serviceTag = XmlHelper.getTagAttributeValuePattern(
21+
XmlHelper.SERVICE_TAG,
22+
XmlHelper.CLASS_ATTRIBUTE
23+
);
24+
psiReferenceRegistrar.registerReferenceProvider(
25+
serviceTag,
26+
new XmlReferenceProvider(new ReferenceResultsFiller[]{
27+
InterfacesResultsFiller.INSTANCE
28+
}));
29+
30+
// <service method="MethodName"/>
31+
XmlAttributeValuePattern methodAttribute = XmlHelper.getMethodAttributePattern();
32+
psiReferenceRegistrar.registerReferenceProvider(
33+
methodAttribute,
34+
new XmlReferenceProvider(new ReferenceResultsFiller[]{
35+
new ServiceMethodResultsFiller()
36+
})
37+
);
38+
}
39+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package com.magento.idea.magento2plugin.xml.webapi.reference.fill;
2+
3+
import com.intellij.patterns.XmlAttributeValuePattern;
4+
import com.intellij.psi.PsiElement;
5+
import com.intellij.psi.PsiReference;
6+
import com.intellij.psi.ResolveResult;
7+
import com.intellij.psi.util.PsiTreeUtil;
8+
import com.intellij.psi.xml.XmlAttribute;
9+
import com.intellij.psi.xml.XmlAttributeValue;
10+
import com.intellij.psi.xml.XmlTag;
11+
import com.jetbrains.php.lang.psi.elements.Method;
12+
import com.jetbrains.php.lang.psi.elements.PhpClass;
13+
import com.jetbrains.php.lang.psi.resolve.PhpResolveResult;
14+
import com.magento.idea.magento2plugin.xml.reference.util.ReferenceResultsFiller;
15+
import com.magento.idea.magento2plugin.xml.webapi.XmlHelper;
16+
17+
import javax.annotation.Nullable;
18+
import java.util.List;
19+
20+
/**
21+
* Created by isentiabov on 20.12.2015.
22+
*/
23+
public class ServiceMethodResultsFiller implements ReferenceResultsFiller {
24+
@Override
25+
public void fillResolveResults(PsiElement psiElement, List<ResolveResult> results, String typeName) {
26+
// get service xml tag `method` attribute
27+
XmlAttribute methodAttribute = getMethodAttribute(psiElement);
28+
if (methodAttribute == null) {
29+
return;
30+
}
31+
32+
// get service xml tag
33+
XmlTag serviceTag = getServiceTag(methodAttribute);
34+
if (serviceTag == null) {
35+
return;
36+
}
37+
38+
// get service xml tag `class` attribute
39+
XmlAttribute classAttribute = getClassAttribute(serviceTag);
40+
if (classAttribute == null) {
41+
return;
42+
}
43+
44+
PhpClass serviceInterface = getServiceInterface(classAttribute);
45+
if (serviceInterface == null) {
46+
return;
47+
}
48+
49+
fillResults(serviceInterface, results, typeName);
50+
}
51+
52+
protected XmlAttribute getMethodAttribute(PsiElement xmlAttribute) {
53+
return PsiTreeUtil.getParentOfType(xmlAttribute, XmlAttribute.class);
54+
}
55+
56+
protected XmlTag getServiceTag(XmlAttribute xmlAttribute) {
57+
return PsiTreeUtil.getParentOfType(xmlAttribute, XmlTag.class);
58+
}
59+
60+
protected XmlAttribute getClassAttribute(XmlTag xmlTag) {
61+
return xmlTag.getAttribute(XmlHelper.CLASS_ATTRIBUTE);
62+
}
63+
64+
@Nullable
65+
protected PhpClass getServiceInterface(XmlAttribute xmlAttribute) {
66+
XmlAttributeValue value = xmlAttribute.getValueElement();
67+
if (value == null) {
68+
return null;
69+
}
70+
71+
PsiReference reference = value.getReference();
72+
if (reference == null) {
73+
return null;
74+
}
75+
76+
return (PhpClass)reference.resolve();
77+
}
78+
79+
protected void fillResults(PhpClass serviceInterface, List<ResolveResult> results, String typeName) {
80+
for (Method method : serviceInterface.getMethods()) {
81+
if (method.getName().equals(typeName)) {
82+
results.add(
83+
new PhpResolveResult(method)
84+
);
85+
86+
break;
87+
}
88+
}
89+
}
90+
}

0 commit comments

Comments
 (0)