Skip to content

Commit 13fb080

Browse files
committed
Improved event references for Observeres resolution
1 parent c38bb88 commit 13fb080

File tree

4 files changed

+95
-3
lines changed

4 files changed

+95
-3
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,79 @@
11
package com.magento.idea.magento2plugin.php.inspections;
22

3+
import com.intellij.codeInspection.ProblemHighlightType;
4+
import com.intellij.codeInspection.ProblemsHolder;
5+
import com.intellij.psi.PsiElement;
6+
import com.intellij.psi.PsiElementVisitor;
7+
import com.intellij.psi.PsiReference;
8+
import com.jetbrains.php.lang.inspections.PhpInspection;
9+
import com.jetbrains.php.lang.psi.elements.ClassReference;
10+
import com.jetbrains.php.lang.psi.elements.Method;
11+
import com.jetbrains.php.lang.psi.elements.MethodReference;
12+
import com.jetbrains.php.lang.psi.elements.PhpClass;
13+
import com.jetbrains.php.lang.psi.visitors.PhpElementVisitor;
14+
import com.magento.idea.magento2plugin.php.module.ModuleManager;
15+
import com.magento.idea.magento2plugin.php.util.MagentoTypes;
16+
import org.jetbrains.annotations.NotNull;
17+
318
/**
419
* Created by dkvashnin on 12/18/15.
520
*/
6-
public class ObjectManagerInspection {
21+
public class ObjectManagerInspection extends PhpInspection {
22+
@NotNull
23+
@Override
24+
public PsiElementVisitor buildVisitor(ProblemsHolder problemsHolder, boolean b) {
25+
return new PhpElementVisitor() {
26+
@Override
27+
public void visitPhpMethodReference(MethodReference reference) {
28+
PsiElement referencedElement = reference.resolve();
29+
30+
if(referencedElement instanceof Method) {
31+
ModuleManager moduleManager = ModuleManager.getInstance(referencedElement.getProject());
32+
if (moduleManager.getModuleForFile(reference.getContainingFile()) == null) {
33+
return;
34+
}
35+
36+
PhpClass phpClass = ((Method) referencedElement).getContainingClass();
37+
38+
verifyPhpClass(phpClass, reference);
39+
}
40+
}
41+
42+
@Override
43+
public void visitPhpClassReference(ClassReference reference) {
44+
PsiElement referencedElement = reference.resolve();
45+
46+
if(referencedElement instanceof PhpClass) {
47+
ModuleManager moduleManager = ModuleManager.getInstance(referencedElement.getProject());
48+
if (moduleManager.getModuleForFile(reference.getContainingFile()) == null) {
49+
return;
50+
}
51+
52+
verifyPhpClass((PhpClass)referencedElement, reference);
53+
}
54+
}
55+
56+
private void verifyPhpClass(PhpClass phpClass, PsiReference reference) {
57+
if (phpClass == null) {
58+
return;
59+
}
60+
61+
if (phpClass.getPresentableFQN().equals(MagentoTypes.OBJECT_MANAGER_TYPE)) {
62+
registerProblem(reference);
63+
return;
64+
}
65+
66+
for (PhpClass implementedInterface : phpClass.getImplementedInterfaces()) {
67+
if (implementedInterface.getPresentableFQN().equals(MagentoTypes.OBJECT_MANAGER_TYPE)) {
68+
registerProblem(reference);
69+
return;
70+
}
71+
}
72+
}
73+
74+
private void registerProblem(PsiReference reference) {
75+
problemsHolder.registerProblem(reference, "ObjectManager is not recommended to use in module", ProblemHighlightType.GENERIC_ERROR_OR_WARNING);
76+
}
77+
};
78+
}
779
}

Diff for: src/com/magento/idea/magento2plugin/php/util/MagentoTypes.java

+1
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ public class MagentoTypes {
77
public static final String BLOCK_TYPE = "Magento\\Framework\\View\\Element\\BlockInterface";
88
public static final String OBSERVER_TYPE = "Magento\\Framework\\Event\\ObserverInterface";
99
public static final String OBJECT_MANAGER_TYPE = "Magento\\Framework\\ObjectManagerInterface";
10+
public static final String EVENT_MANAGER_TYPE = "Magento\\Framework\\Event\\ManagerInterface";
1011
}

Diff for: src/com/magento/idea/magento2plugin/xml/observer/reference/EventReferenceProvider.java

+16-2
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,12 @@
55
import com.intellij.psi.PsiReferenceProvider;
66
import com.intellij.psi.util.PsiTreeUtil;
77
import com.intellij.util.ProcessingContext;
8+
import com.jetbrains.php.lang.psi.elements.Method;
89
import com.jetbrains.php.lang.psi.elements.MethodReference;
910
import com.jetbrains.php.lang.psi.elements.ParameterList;
11+
import com.jetbrains.php.lang.psi.elements.PhpClass;
12+
import com.magento.idea.magento2plugin.php.util.MagentoTypes;
13+
import com.magento.idea.magento2plugin.xml.observer.PhpPatternsHelper;
1014
import com.magento.idea.magento2plugin.xml.reference.TypeReference;
1115
import com.magento.idea.magento2plugin.xml.reference.util.ReferenceResultsFiller;
1216
import org.jetbrains.annotations.NotNull;
@@ -16,6 +20,7 @@
1620
*/
1721
class EventReferenceProvider extends PsiReferenceProvider {
1822
private final ReferenceResultsFiller[] resultsFillers;
23+
private static final String DISPATCH_METHOD = "dispatch";
1924

2025
public EventReferenceProvider(ReferenceResultsFiller[] resultsFillers) {
2126
this.resultsFillers = resultsFillers;
@@ -35,11 +40,20 @@ public PsiReference[] getReferencesByElement(@NotNull PsiElement psiElement, @No
3540
}
3641

3742
MethodReference methodReference = (MethodReference)parameterList.getContext();
38-
if (!methodReference.getName().equals("dispatch")) {
43+
if (!DISPATCH_METHOD.equals(methodReference.getName())) {
3944
return new PsiReference[0];
4045
}
4146

47+
PsiElement resolvedElement = methodReference.resolve();
48+
if (resolvedElement != null && resolvedElement instanceof Method) {
49+
PhpClass containingClass = ((Method) resolvedElement).getContainingClass();
4250

43-
return new PsiReference[]{new TypeReference(psiElement, this.resultsFillers, true)};
51+
if (containingClass != null && MagentoTypes.EVENT_MANAGER_TYPE.equals(containingClass.getPresentableFQN())) {
52+
return new PsiReference[]{new TypeReference(psiElement, this.resultsFillers, true)};
53+
}
54+
}
55+
56+
57+
return new PsiReference[0];
4458
}
4559
}
+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<html>
2+
<body>
3+
ObjectManager usage in Module scope
4+
</body>
5+
</html>

0 commit comments

Comments
 (0)