Skip to content

Commit 2dbd029

Browse files
dkvashninbaylenaorobei
authored andcommitted
Fixed @api inspection, added context completions for Block classes in layouts, added context completions for Observer classes
(cherry picked from commit 1cb76a9)
1 parent 9a84467 commit 2dbd029

16 files changed

+188
-24
lines changed

src/com/magento/idea/magento2plugin/php/inspections/MagentoApiInspection.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public void visitPhpMethodReference(MethodReference reference) {
3535
}
3636

3737
if (!MagentoApiInspection.isValidReference(phpClass, reference.getElement())
38-
|| !MagentoApiInspection.isValidReference((Method) referencedElement, reference.getElement())) {
38+
&& !MagentoApiInspection.isValidReference((Method) referencedElement, reference.getElement())) {
3939
problemsHolder.registerProblem(reference, "Method #ref is not in module API", ProblemHighlightType.GENERIC_ERROR_OR_WARNING);
4040
}
4141
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.magento.idea.magento2plugin.php.util;
2+
3+
import com.intellij.psi.PsiElement;
4+
import com.jetbrains.php.lang.psi.elements.PhpClass;
5+
import com.magento.idea.magento2plugin.util.PsiContextMatcherI;
6+
7+
/**
8+
* Created by dkvashnin on 12/18/15.
9+
*/
10+
public class ImplementationMatcher implements PsiContextMatcherI {
11+
private String type;
12+
13+
public ImplementationMatcher(String type) {
14+
this.type = type;
15+
}
16+
17+
@Override
18+
public boolean match(PsiElement psiElement) {
19+
if (psiElement instanceof PhpClass) {
20+
for (PhpClass parent : ((PhpClass)psiElement).getImplementedInterfaces()) {
21+
if (parent.getPresentableFQN().equals(type)) {
22+
return true;
23+
}
24+
}
25+
26+
PhpClass parent = ((PhpClass) psiElement).getSuperClass();
27+
if (parent != null) {
28+
return match(parent);
29+
}
30+
}
31+
return false;
32+
}
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.magento.idea.magento2plugin.php.util;
2+
3+
/**
4+
* Created by dkvashnin on 12/18/15.
5+
*/
6+
public class MagentoTypes {
7+
public static final String BLOCK_TYPE = "Magento\\Framework\\View\\Element\\BlockInterface";
8+
public static final String OBSERVER_TYPE = "Magento\\Framework\\Event\\ObserverInterface";
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.magento.idea.magento2plugin.php.util;
2+
3+
import com.magento.idea.magento2plugin.util.PsiContextMatcherI;
4+
5+
import java.util.HashMap;
6+
import java.util.Map;
7+
8+
/**
9+
* Created by dkvashnin on 12/18/15.
10+
*/
11+
public class PsiContextMatcherManager {
12+
private static PsiContextMatcherManager INSTANCE;
13+
14+
private Map<String, PsiContextMatcherI> map = new HashMap<>();
15+
16+
private PsiContextMatcherManager() {}
17+
18+
public ImplementationMatcher getImplementationMatcherForType(String type) {
19+
if (map.containsKey(type)) {
20+
21+
PsiContextMatcherI psiContextMatcherI = map.get(type);
22+
if (psiContextMatcherI instanceof ImplementationMatcher) {
23+
return (ImplementationMatcher)psiContextMatcherI;
24+
}
25+
}
26+
ImplementationMatcher implementationMatcher = new ImplementationMatcher(type);
27+
map.put(type, implementationMatcher);
28+
29+
return implementationMatcher;
30+
}
31+
32+
public static PsiContextMatcherManager getInstance() {
33+
if (INSTANCE == null) {
34+
INSTANCE = new PsiContextMatcherManager();
35+
}
36+
37+
return INSTANCE;
38+
}
39+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.magento.idea.magento2plugin.util;
2+
3+
import com.intellij.psi.PsiElement;
4+
5+
/**
6+
* Created by dkvashnin on 12/18/15.
7+
*/
8+
public interface PsiContextMatcherI {
9+
boolean match(PsiElement psiElement);
10+
}

src/com/magento/idea/magento2plugin/xml/completion/ClassCompletionProvider.java

+11-3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import com.jetbrains.php.PhpIcons;
99
import com.jetbrains.php.PhpIndex;
1010
import com.jetbrains.php.lang.psi.elements.PhpClass;
11+
import com.magento.idea.magento2plugin.util.PsiContextMatcherI;
12+
import org.jetbrains.annotations.Nullable;
1113

1214
import java.util.ArrayList;
1315
import java.util.Collection;
@@ -20,7 +22,7 @@ public class ClassCompletionProvider implements CompletionProviderI {
2022
public final static CompletionProviderI INSTANCE = new ClassCompletionProvider();
2123

2224
@Override
23-
public List<LookupElement> collectCompletionResult(PsiElement psiElement) {
25+
public List<LookupElement> collectCompletionResult(PsiElement psiElement, @Nullable PsiContextMatcherI context) {
2426
List<LookupElement> result = new ArrayList<>();
2527
PhpIndex phpIndex = PhpIndex.getInstance(psiElement.getProject());
2628
String prefix = StringUtil.unquoteString(psiElement.getText());
@@ -30,11 +32,12 @@ public List<LookupElement> collectCompletionResult(PsiElement psiElement) {
3032
for (String className: classNames) {
3133
Collection<PhpClass> classesByName = phpIndex.getClassesByName(className);
3234
for (PhpClass phpClass: classesByName) {
33-
String classFqn = phpClass.getPresentableFQN();
34-
if (classFqn == null) {
35+
if (context != null && !context.match(phpClass)) {
3536
continue;
3637
}
3738

39+
String classFqn = phpClass.getPresentableFQN();
40+
3841
result.add(
3942
LookupElementBuilder
4043
.create(classFqn)
@@ -45,4 +48,9 @@ public List<LookupElement> collectCompletionResult(PsiElement psiElement) {
4548

4649
return result;
4750
}
51+
52+
@Override
53+
public List<LookupElement> collectCompletionResult(PsiElement psiElement) {
54+
return collectCompletionResult(psiElement, null);
55+
}
4856
}

src/com/magento/idea/magento2plugin/xml/completion/CompletionProviderI.java

+4
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,16 @@
22

33
import com.intellij.codeInsight.lookup.LookupElement;
44
import com.intellij.psi.PsiElement;
5+
import com.magento.idea.magento2plugin.util.PsiContextMatcherI;
6+
import org.jetbrains.annotations.Nullable;
57

68
import java.util.List;
79

810
/**
911
* Created by dkvashnin on 11/17/15.
1012
*/
1113
public interface CompletionProviderI {
14+
public List<LookupElement> collectCompletionResult(PsiElement psiElement, @Nullable PsiContextMatcherI context);
15+
1216
public List<LookupElement> collectCompletionResult(PsiElement psiElement);
1317
}

src/com/magento/idea/magento2plugin/xml/completion/VirtualTypeCompletionProvider.java

+8-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
import com.intellij.codeInsight.lookup.LookupElement;
44
import com.intellij.codeInsight.lookup.LookupElementBuilder;
55
import com.intellij.psi.PsiElement;
6+
import com.magento.idea.magento2plugin.util.PsiContextMatcherI;
67
import com.magento.idea.magento2plugin.xml.di.index.VirtualTypesNamesFileBasedIndex;
8+
import org.jetbrains.annotations.Nullable;
79

810
import java.util.ArrayList;
911
import java.util.List;
@@ -15,7 +17,7 @@ public class VirtualTypeCompletionProvider implements CompletionProviderI {
1517
public final static CompletionProviderI INSTANCE = new VirtualTypeCompletionProvider();
1618

1719
@Override
18-
public List<LookupElement> collectCompletionResult(PsiElement psiElement) {
20+
public List<LookupElement> collectCompletionResult(PsiElement psiElement, @Nullable PsiContextMatcherI context) {
1921
List<LookupElement> result = new ArrayList<>();
2022
String[] allVirtualTypesNames = VirtualTypesNamesFileBasedIndex.getAllVirtualTypesNames(
2123
psiElement.getProject()
@@ -27,4 +29,9 @@ public List<LookupElement> collectCompletionResult(PsiElement psiElement) {
2729

2830
return result;
2931
}
32+
33+
@Override
34+
public List<LookupElement> collectCompletionResult(PsiElement psiElement) {
35+
return collectCompletionResult(psiElement, null);
36+
}
3037
}

src/com/magento/idea/magento2plugin/xml/di/completion/DiCompletionContributor.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,4 @@ public void addCompletions(@NotNull CompletionParameters parameters,
4141
}
4242
);
4343
}
44-
}
44+
}

src/com/magento/idea/magento2plugin/xml/layout/completion/LayoutCompletionContributor.java

+7-7
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,19 @@
55
import com.intellij.openapi.project.Project;
66
import com.intellij.patterns.XmlPatterns;
77
import com.intellij.psi.PsiElement;
8-
import com.intellij.util.PlatformIcons;
98
import com.intellij.util.ProcessingContext;
10-
import com.intellij.util.indexing.FileBasedIndex;
11-
import com.intellij.xml.util.XmlIconProvider;
12-
import com.jetbrains.php.PhpIcons;
9+
import com.magento.idea.magento2plugin.php.util.MagentoTypes;
10+
import com.magento.idea.magento2plugin.php.util.PsiContextMatcherManager;
11+
import com.magento.idea.magento2plugin.util.PsiContextMatcherI;
1312
import com.magento.idea.magento2plugin.xml.XmlHelperUtility;
1413
import com.magento.idea.magento2plugin.xml.completion.ClassCompletionProvider;
1514
import com.magento.idea.magento2plugin.xml.completion.CompletionProviderI;
1615
import com.magento.idea.magento2plugin.xml.completion.VirtualTypeCompletionProvider;
1716
import com.magento.idea.magento2plugin.xml.layout.LayoutUtility;
18-
import com.magento.idea.magento2plugin.xml.layout.index.AbstractComponentNameFileBasedIndex;
1917
import com.magento.idea.magento2plugin.xml.layout.index.BlockFileBasedIndex;
2018
import com.magento.idea.magento2plugin.xml.layout.index.ContainerFileBasedIndex;
2119
import org.jetbrains.annotations.NotNull;
2220

23-
import java.util.Collection;
2421
import java.util.stream.Collectors;
2522

2623
/**
@@ -44,8 +41,10 @@ public LayoutCompletionContributor() {
4441
@Override
4542
protected void addCompletions(@NotNull CompletionParameters completionParameters, ProcessingContext processingContext, @NotNull CompletionResultSet completionResultSet) {
4643
PsiElement psiElement = completionParameters.getOriginalPosition();
44+
PsiContextMatcherI completionContext = PsiContextMatcherManager.getInstance()
45+
.getImplementationMatcherForType(MagentoTypes.BLOCK_TYPE);
4746
for (CompletionProviderI completionProvider: typeCompletionProviders) {
48-
completionResultSet.addAllElements(completionProvider.collectCompletionResult(psiElement));
47+
completionResultSet.addAllElements(completionProvider.collectCompletionResult(psiElement, completionContext));
4948
}
5049
}
5150
}
@@ -103,4 +102,5 @@ protected void addCompletions(@NotNull CompletionParameters completionParameters
103102
}
104103
);
105104
}
105+
106106
}

src/com/magento/idea/magento2plugin/xml/layout/completion/ReferenceComponentCompletionProvider.java

+8-1
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55
import com.intellij.psi.PsiElement;
66
import com.intellij.util.indexing.ID;
77
import com.jetbrains.php.PhpIcons;
8+
import com.magento.idea.magento2plugin.util.PsiContextMatcherI;
89
import com.magento.idea.magento2plugin.xml.completion.CompletionProviderI;
910
import com.magento.idea.magento2plugin.xml.layout.index.util.LayoutIndexUtility;
11+
import org.jetbrains.annotations.Nullable;
1012

1113
import java.util.ArrayList;
1214
import java.util.Collection;
@@ -23,7 +25,7 @@ public ReferenceComponentCompletionProvider(ID<String, Void> indexId) {
2325
}
2426

2527
@Override
26-
public List<LookupElement> collectCompletionResult(PsiElement psiElement) {
28+
public List<LookupElement> collectCompletionResult(PsiElement psiElement, @Nullable PsiContextMatcherI context) {
2729
Collection<String> keys = LayoutIndexUtility.getAllKeys(indexId, psiElement.getProject());
2830

2931
List<LookupElement> results = new ArrayList<>();
@@ -35,4 +37,9 @@ public List<LookupElement> collectCompletionResult(PsiElement psiElement) {
3537

3638
return results;
3739
}
40+
41+
@Override
42+
public List<LookupElement> collectCompletionResult(PsiElement psiElement) {
43+
return collectCompletionResult(psiElement, null);
44+
}
3845
}

src/com/magento/idea/magento2plugin/xml/layout/reference/LayoutReferenceContributor.java

+3-7
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,20 @@
11
package com.magento.idea.magento2plugin.xml.layout.reference;
22

3-
import com.intellij.openapi.vfs.VirtualFile;
43
import com.intellij.patterns.XmlPatterns;
54
import com.intellij.psi.*;
6-
import com.intellij.psi.search.FilenameIndex;
7-
import com.intellij.util.indexing.FileBasedIndex;
5+
import com.magento.idea.magento2plugin.php.util.MagentoTypes;
86
import com.magento.idea.magento2plugin.xml.XmlHelperUtility;
97
import com.magento.idea.magento2plugin.xml.di.reference.provider.XmlReferenceProvider;
108
import com.magento.idea.magento2plugin.xml.layout.LayoutUtility;
11-
import com.magento.idea.magento2plugin.xml.layout.index.BlockFileBasedIndex;
12-
import com.magento.idea.magento2plugin.xml.layout.index.ContainerFileBasedIndex;
139
import com.magento.idea.magento2plugin.xml.layout.reference.fill.BlockResultsFiller;
1410
import com.magento.idea.magento2plugin.xml.layout.reference.fill.ContainerResultsFiller;
1511
import com.magento.idea.magento2plugin.xml.reference.util.ClassesResultsFiller;
12+
import com.magento.idea.magento2plugin.xml.reference.util.ImplementationContextDecorator;
1613
import com.magento.idea.magento2plugin.xml.reference.util.ReferenceResultsFiller;
1714
import com.magento.idea.magento2plugin.xml.reference.util.VirtualTypesResultsFiller;
1815
import org.jetbrains.annotations.NotNull;
1916

2017
import java.util.Arrays;
21-
import java.util.Collection;
2218
import java.util.List;
2319

2420
/**
@@ -32,7 +28,7 @@ public void registerReferenceProviders(@NotNull PsiReferenceRegistrar psiReferen
3228
XmlHelperUtility.getTagAttributeValuePattern("block", "class"),
3329
new XmlReferenceProvider(
3430
new ReferenceResultsFiller[]{
35-
ClassesResultsFiller.INSTANCE,
31+
new ImplementationContextDecorator(ClassesResultsFiller.INSTANCE, MagentoTypes.BLOCK_TYPE),
3632
VirtualTypesResultsFiller.INSTANCE
3733
}
3834
)

src/com/magento/idea/magento2plugin/xml/observer/completion/EventCompletionContributor.java

+7-1
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,13 @@
55
import com.intellij.psi.PsiElement;
66
import com.intellij.util.ProcessingContext;
77
import com.intellij.util.indexing.FileBasedIndex;
8+
import com.magento.idea.magento2plugin.php.util.MagentoTypes;
9+
import com.magento.idea.magento2plugin.php.util.PsiContextMatcherManager;
810
import com.magento.idea.magento2plugin.xml.XmlHelperUtility;
911
import com.magento.idea.magento2plugin.xml.completion.ClassCompletionProvider;
1012
import com.magento.idea.magento2plugin.xml.completion.CompletionProviderI;
1113
import com.magento.idea.magento2plugin.xml.completion.VirtualTypeCompletionProvider;
14+
import com.magento.idea.magento2plugin.php.util.ImplementationMatcher;
1215
import com.magento.idea.magento2plugin.xml.observer.XmlHelper;
1316
import com.magento.idea.magento2plugin.xml.observer.index.EventsDeclarationsFileBasedIndex;
1417
import org.jetbrains.annotations.NotNull;
@@ -31,9 +34,11 @@ public EventCompletionContributor() {
3134
new CompletionProvider<CompletionParameters>() {
3235
@Override
3336
protected void addCompletions(@NotNull CompletionParameters completionParameters, ProcessingContext processingContext, @NotNull CompletionResultSet completionResultSet) {
37+
ImplementationMatcher completionContext = PsiContextMatcherManager.getInstance()
38+
.getImplementationMatcherForType(MagentoTypes.OBSERVER_TYPE);
3439
PsiElement psiElement = completionParameters.getOriginalPosition();
3540
for (CompletionProviderI completionProvider: typeCompletionProviders) {
36-
completionResultSet.addAllElements(completionProvider.collectCompletionResult(psiElement));
41+
completionResultSet.addAllElements(completionProvider.collectCompletionResult(psiElement, completionContext));
3742
}
3843
}
3944
}
@@ -56,5 +61,6 @@ protected void addCompletions(@NotNull CompletionParameters completionParameters
5661
}
5762
);
5863
}
64+
5965
}
6066

src/com/magento/idea/magento2plugin/xml/observer/reference/ObserverReferenceContributor.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
package com.magento.idea.magento2plugin.xml.observer.reference;
22

33
import com.intellij.psi.*;
4+
import com.magento.idea.magento2plugin.php.util.MagentoTypes;
45
import com.magento.idea.magento2plugin.xml.di.reference.provider.XmlReferenceProvider;
56
import com.magento.idea.magento2plugin.xml.observer.XmlHelper;
67
import com.magento.idea.magento2plugin.xml.observer.reference.util.EventsDeclarationsFilesResultsFiller;
78
import com.magento.idea.magento2plugin.xml.reference.util.ClassesResultsFiller;
9+
import com.magento.idea.magento2plugin.xml.reference.util.ImplementationContextDecorator;
810
import com.magento.idea.magento2plugin.xml.reference.util.ReferenceResultsFiller;
911
import com.magento.idea.magento2plugin.xml.reference.util.VirtualTypesResultsFiller;
1012
import org.jetbrains.annotations.NotNull;
1113

14+
1215
/**
1316
* Created by dkvashnin on 11/2/15.
1417
*/
@@ -20,7 +23,7 @@ public void registerReferenceProviders(@NotNull PsiReferenceRegistrar psiReferen
2023
XmlHelper.getTagAttributeValuePattern(XmlHelper.OBSERVER_TAG, XmlHelper.INSTANCE_ATTRIBUTE),
2124
new XmlReferenceProvider(
2225
new ReferenceResultsFiller[]{
23-
ClassesResultsFiller.INSTANCE,
26+
new ImplementationContextDecorator(ClassesResultsFiller.INSTANCE, MagentoTypes.OBSERVER_TYPE),
2427
VirtualTypesResultsFiller.INSTANCE
2528
}
2629
)

src/com/magento/idea/magento2plugin/xml/reference/util/ClassesResultsFiller.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,11 @@ public void fillResolveResults(PsiElement psiElement, List<ResolveResult> result
2222
PhpIndex phpIndex = PhpIndex.getInstance(psiElement.getProject());
2323

2424
for (PhpClass phpClass : phpIndex.getClassesByFQN(PhpLangUtil.toFQN(typeName))) {
25-
results.add(new PsiElementResolveResult(phpClass));
25+
addResult(results, phpClass);
2626
}
2727
}
28+
29+
protected void addResult(List<ResolveResult> results, PhpClass phpClass) {
30+
results.add(new PsiElementResolveResult(phpClass));
31+
}
2832
}

0 commit comments

Comments
 (0)