Skip to content

Commit 8cd0e60

Browse files
452: Added extended by references for the MFTF tests
1 parent c8d2559 commit 8cd0e60

File tree

5 files changed

+206
-0
lines changed

5 files changed

+206
-0
lines changed

resources/META-INF/plugin.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@
171171
<fileBasedIndex implementation="com.magento.idea.magento2plugin.stubs.indexes.mftf.DataIndex" />
172172
<fileBasedIndex implementation="com.magento.idea.magento2plugin.stubs.indexes.mftf.PageIndex" />
173173
<fileBasedIndex implementation="com.magento.idea.magento2plugin.stubs.indexes.mftf.TestNameIndex" />
174+
<fileBasedIndex implementation="com.magento.idea.magento2plugin.stubs.indexes.mftf.TestExtendsIndex" />
174175
<fileBasedIndex implementation="com.magento.idea.magento2plugin.stubs.indexes.js.RequireJsIndex" />
175176
<fileBasedIndex implementation="com.magento.idea.magento2plugin.stubs.indexes.js.MagentoLibJsIndex" />
176177
<fileBasedIndex implementation="com.magento.idea.magento2plugin.stubs.indexes.xml.AclResourceIndex" />

src/com/magento/idea/magento2plugin/indexes/IndexManager.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import com.magento.idea.magento2plugin.stubs.indexes.mftf.DataIndex;
2424
import com.magento.idea.magento2plugin.stubs.indexes.mftf.PageIndex;
2525
import com.magento.idea.magento2plugin.stubs.indexes.mftf.SectionIndex;
26+
import com.magento.idea.magento2plugin.stubs.indexes.mftf.TestExtendsIndex;
2627
import com.magento.idea.magento2plugin.stubs.indexes.mftf.TestNameIndex;
2728
import com.magento.idea.magento2plugin.stubs.indexes.xml.AclResourceIndex;
2829
import com.magento.idea.magento2plugin.stubs.indexes.xml.DeclarativeSchemaElementsIndex;
@@ -68,6 +69,7 @@ public static void manualReindex() {
6869
PageIndex.KEY,
6970
SectionIndex.KEY,
7071
TestNameIndex.KEY,
72+
TestExtendsIndex.KEY,
7173
//graphql
7274
GraphQlResolverIndex.KEY
7375
};
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
/*
2+
* Copyright © Magento, Inc. All rights reserved.
3+
* See COPYING.txt for license details.
4+
*/
5+
6+
package com.magento.idea.magento2plugin.reference.provider.mftf;
7+
8+
import com.intellij.ide.highlighter.XmlFileType;
9+
import com.intellij.openapi.util.text.StringUtil;
10+
import com.intellij.openapi.vfs.VirtualFile;
11+
import com.intellij.psi.PsiElement;
12+
import com.intellij.psi.PsiFile;
13+
import com.intellij.psi.PsiManager;
14+
import com.intellij.psi.PsiReference;
15+
import com.intellij.psi.PsiReferenceProvider;
16+
import com.intellij.psi.search.GlobalSearchScope;
17+
import com.intellij.psi.xml.XmlAttributeValue;
18+
import com.intellij.psi.xml.XmlFile;
19+
import com.intellij.util.ProcessingContext;
20+
import com.intellij.util.indexing.FileBasedIndex;
21+
import com.magento.idea.magento2plugin.magento.files.MftfTest;
22+
import com.magento.idea.magento2plugin.reference.xml.PolyVariantReferenceBase;
23+
import com.magento.idea.magento2plugin.stubs.indexes.mftf.TestExtendsIndex;
24+
import com.magento.idea.magento2plugin.util.xml.XmlPsiTreeUtil;
25+
import java.util.ArrayList;
26+
import java.util.Collection;
27+
import java.util.List;
28+
import org.jetbrains.annotations.NotNull;
29+
30+
public class TestExtendedByReferenceProvider extends PsiReferenceProvider {
31+
32+
@NotNull
33+
@Override
34+
public PsiReference[] getReferencesByElement(
35+
final @NotNull PsiElement element,
36+
final @NotNull ProcessingContext context
37+
) {
38+
final List<PsiReference> extendedByReferences = new ArrayList<>();
39+
final String testName = StringUtil.unquoteString(element.getText());
40+
final Collection<VirtualFile> containingFiles = FileBasedIndex.getInstance()
41+
.getContainingFiles(
42+
TestExtendsIndex.KEY,
43+
testName,
44+
GlobalSearchScope.getScopeRestrictedByFileTypes(
45+
GlobalSearchScope.allScope(element.getProject()),
46+
XmlFileType.INSTANCE
47+
)
48+
);
49+
final PsiManager psiManager = PsiManager.getInstance(element.getProject());
50+
final List<PsiElement> psiElements = new ArrayList<>();
51+
52+
for (final VirtualFile virtualFile: containingFiles) {
53+
final PsiFile file = psiManager.findFile(virtualFile);
54+
55+
if (!(file instanceof XmlFile)) {
56+
continue;
57+
}
58+
final XmlFile xmlFile = (XmlFile) file;
59+
60+
final Collection<XmlAttributeValue> valueElements = XmlPsiTreeUtil
61+
.findAttributeValueElements(
62+
xmlFile,
63+
MftfTest.TEST_TAG,
64+
MftfTest.EXTENDS_ATTRIBUTE,
65+
testName
66+
);
67+
68+
psiElements.addAll(valueElements);
69+
}
70+
71+
if (!psiElements.isEmpty()) {
72+
extendedByReferences.add(new PolyVariantReferenceBase(element, psiElements));
73+
}
74+
75+
return extendedByReferences.toArray(new PsiReference[0]);
76+
}
77+
}

src/com/magento/idea/magento2plugin/reference/xml/XmlReferenceContributor.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,19 @@ public void registerReferenceProviders(@NotNull PsiReferenceRegistrar registrar)
264264
)
265265
);
266266

267+
// <test name="A" extends="B" />
268+
registrar.registerReferenceProvider(
269+
XmlPatterns.xmlAttributeValue().withParent(XmlPatterns.xmlAttribute()
270+
.withName(MftfTest.NAME_ATTRIBUTE)
271+
.withParent(XmlPatterns.xmlTag().withName(MftfTest.TEST_TAG)
272+
.withParent(XmlPatterns.xmlTag().withName(MftfTest.ROOT_TAG))
273+
)
274+
),
275+
new CompositeReferenceProvider(
276+
new TestExtendedByReferenceProvider()
277+
)
278+
);
279+
267280
// <someXmlTag component="requireJsMappingKey" />
268281
registrar.registerReferenceProvider(
269282
XmlPatterns.xmlAttributeValue().withParent(
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
/*
2+
* Copyright © Magento, Inc. All rights reserved.
3+
* See COPYING.txt for license details.
4+
*/
5+
6+
package com.magento.idea.magento2plugin.stubs.indexes.mftf;
7+
8+
import com.intellij.ide.highlighter.XmlFileType;
9+
import com.intellij.openapi.project.Project;
10+
import com.intellij.psi.PsiFile;
11+
import com.intellij.psi.util.PsiTreeUtil;
12+
import com.intellij.psi.xml.XmlDocument;
13+
import com.intellij.psi.xml.XmlFile;
14+
import com.intellij.psi.xml.XmlTag;
15+
import com.intellij.util.indexing.DataIndexer;
16+
import com.intellij.util.indexing.FileBasedIndex;
17+
import com.intellij.util.indexing.FileContent;
18+
import com.intellij.util.indexing.ID;
19+
import com.intellij.util.indexing.ScalarIndexExtension;
20+
import com.intellij.util.io.EnumeratorStringDescriptor;
21+
import com.intellij.util.io.KeyDescriptor;
22+
import com.magento.idea.magento2plugin.magento.files.MftfTest;
23+
import com.magento.idea.magento2plugin.project.Settings;
24+
import gnu.trove.THashMap;
25+
import java.util.Map;
26+
import org.jetbrains.annotations.NotNull;
27+
28+
public class TestExtendsIndex extends ScalarIndexExtension<String> {
29+
30+
public static final ID<String, Void> KEY = ID.create(
31+
"com.magento.idea.magento2plugin.stubs.indexes.mftf.test_extends_index"
32+
);
33+
34+
private final KeyDescriptor<String> myKeyDescriptor = new EnumeratorStringDescriptor();
35+
36+
@NotNull
37+
@Override
38+
@SuppressWarnings("PMD.CognitiveComplexity")
39+
public DataIndexer<String, Void, FileContent> getIndexer() {
40+
return inputData -> {
41+
final Map<String, Void> map = new THashMap<>();
42+
final PsiFile psiFile = inputData.getPsiFile();
43+
final Project project = psiFile.getProject();
44+
45+
if (!Settings.isEnabled(project)
46+
|| !Settings.isMftfSupportEnabled(project)
47+
|| !(psiFile instanceof XmlFile)
48+
) {
49+
return map;
50+
}
51+
final XmlDocument xmlDocument = ((XmlFile) psiFile).getDocument();
52+
53+
if (xmlDocument == null) {
54+
return map;
55+
}
56+
final XmlTag xmlRootTag = xmlDocument.getRootTag();
57+
58+
if (xmlRootTag == null
59+
|| !xmlRootTag.getName().equals(MftfTest.ROOT_TAG)) {
60+
return map;
61+
}
62+
final XmlTag[] xmlTags = PsiTreeUtil.getChildrenOfType(
63+
psiFile.getFirstChild(),
64+
XmlTag.class
65+
);
66+
67+
if (xmlTags == null) {
68+
return map;
69+
}
70+
71+
for (final XmlTag childTag : xmlRootTag.getSubTags()) {
72+
final String name = childTag.getAttributeValue(MftfTest.EXTENDS_ATTRIBUTE);
73+
74+
if (name == null || name.isEmpty()) {
75+
continue;
76+
}
77+
map.put(name, null);
78+
}
79+
80+
return map;
81+
};
82+
}
83+
84+
@NotNull
85+
@Override
86+
public ID<String, Void> getName() {
87+
return KEY;
88+
}
89+
90+
@NotNull
91+
@Override
92+
public KeyDescriptor<String> getKeyDescriptor() {
93+
return this.myKeyDescriptor;
94+
}
95+
96+
@NotNull
97+
@Override
98+
public FileBasedIndex.InputFilter getInputFilter() {
99+
return file ->
100+
file.getFileType() == XmlFileType.INSTANCE
101+
&& file.getPath().contains(MftfTest.FILE_DIR_PARENTS);
102+
}
103+
104+
@Override
105+
public boolean dependsOnFileContent() {
106+
return true;
107+
}
108+
109+
@Override
110+
public int getVersion() {
111+
return 1;
112+
}
113+
}

0 commit comments

Comments
 (0)