Skip to content

Commit 6e5f940

Browse files
authored
Merge pull request #801 from bohdan-harniuk/bugfix/663-fix-null-pointer-exception-for-plugin-reference-provider-cleanup
[4.2.0-develop] Bug-663: Fixed NullPointerException for PluginReferenceProvider
2 parents 1c9e07c + 738bbe5 commit 6e5f940

File tree

2 files changed

+46
-11
lines changed

2 files changed

+46
-11
lines changed

src/com/magento/idea/magento2plugin/reference/provider/PluginReferenceProvider.java

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/**
1+
/*
22
* Copyright © Magento, Inc. All rights reserved.
33
* See COPYING.txt for license details.
44
*/
@@ -16,49 +16,83 @@
1616
import com.intellij.psi.xml.XmlTag;
1717
import com.intellij.util.ProcessingContext;
1818
import com.magento.idea.magento2plugin.indexes.PluginIndex;
19+
import com.magento.idea.magento2plugin.magento.files.ModuleDiXml;
1920
import com.magento.idea.magento2plugin.reference.xml.PolyVariantReferenceBase;
2021
import java.util.ArrayList;
2122
import java.util.Collection;
2223
import java.util.List;
2324
import org.jetbrains.annotations.NotNull;
2425

2526
public class PluginReferenceProvider extends PsiReferenceProvider {
27+
28+
@SuppressWarnings({
29+
"PMD.CognitiveComplexity",
30+
"PMD.CyclomaticComplexity",
31+
"PMD.NPathComplexity"
32+
})
2633
@Override
2734
public @NotNull PsiReference[] getReferencesByElement(
28-
@NotNull final PsiElement element,
29-
@NotNull final ProcessingContext context
35+
final @NotNull PsiElement element,
36+
final @NotNull ProcessingContext context
3037
) {
31-
final List<PsiReference> psiReferences = new ArrayList<>();
32-
final Project project = element.getProject();
33-
final List<PsiElement> psiElements = new ArrayList<>();
38+
if (!(element.getParent() instanceof XmlAttribute)
39+
|| !ModuleDiXml.NAME_ATTR.equals(((XmlAttribute) element.getParent()).getName())
40+
|| !(element.getParent().getParent() instanceof XmlTag)
41+
|| !ModuleDiXml.PLUGIN_TAG_NAME.equals(
42+
((XmlTag) element.getParent().getParent()).getName())
43+
) {
44+
return PsiReference.EMPTY_ARRAY;
45+
}
3446

3547
final XmlTag originalPluginTag = (XmlTag) element.getParent().getParent();
3648
final XmlTag originalTypeTag = originalPluginTag.getParentTag();
37-
final String originalPluginName = originalPluginTag.getAttribute("name").getValue();
38-
final String originalTypeName = originalTypeTag.getAttribute("name").getValue();
49+
50+
if (originalTypeTag == null || !ModuleDiXml.TYPE_TAG.equals(originalTypeTag.getName())) {
51+
return PsiReference.EMPTY_ARRAY;
52+
}
53+
final XmlAttribute originalPluginNameAttr = originalPluginTag.getAttribute("name");
54+
final XmlAttribute originalTypeNameAttr = originalTypeTag.getAttribute("name");
55+
56+
if (originalPluginNameAttr == null || originalTypeNameAttr == null) {
57+
return PsiReference.EMPTY_ARRAY;
58+
}
59+
final String originalPluginName = originalPluginNameAttr.getValue();
60+
final String originalTypeName = originalTypeNameAttr.getValue();
61+
62+
if (originalPluginName == null || originalTypeName == null) {
63+
return PsiReference.EMPTY_ARRAY;
64+
}
65+
final Project project = element.getProject();
3966

4067
final Collection<PsiElement> types = PluginIndex.getInstance(project).getPluginElements(
4168
originalTypeName,
4269
GlobalSearchScope.getScopeRestrictedByFileTypes(
4370
GlobalSearchScope.allScope(project), XmlFileType.INSTANCE
4471
)
4572
);
73+
final List<PsiElement> psiElements = new ArrayList<>();
4674

4775
for (final PsiElement type: types) {
4876
final XmlTag typeTag = (XmlTag) type.getParent().getParent();
4977
final XmlTag[] pluginTags = typeTag.findSubTags("plugin");
78+
5079
for (final XmlTag pluginTag: pluginTags) {
5180
final XmlAttribute pluginNameAttribute = pluginTag.getAttribute("name");
52-
if (pluginNameAttribute.getValue().equals(originalPluginName)) {
81+
82+
if (pluginNameAttribute != null
83+
&& pluginNameAttribute.getValue() != null
84+
&& originalPluginName.equals(pluginNameAttribute.getValue())) {
5385
psiElements.add(pluginNameAttribute.getValueElement());
5486
}
5587
}
5688
}
89+
final List<PsiReference> psiReferences = new ArrayList<>();
5790

5891
if (!psiElements.isEmpty()) {
5992
final int startIndex = element.getText().indexOf(originalPluginName);
6093
final int endIndex = startIndex + originalPluginName.length();
6194
final TextRange range = new TextRange(startIndex, endIndex);
95+
6296
psiReferences.add(new PolyVariantReferenceBase(element, range, psiElements));
6397
}
6498

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/**
1+
/*
22
* Copyright © Magento, Inc. All rights reserved.
33
* See COPYING.txt for license details.
44
*/
@@ -12,6 +12,7 @@
1212
import com.magento.idea.magento2plugin.magento.files.MftfActionGroup;
1313
import com.magento.idea.magento2plugin.magento.files.MftfTest;
1414
import com.magento.idea.magento2plugin.magento.files.ModuleDbSchemaXml;
15+
import com.magento.idea.magento2plugin.magento.files.ModuleDiXml;
1516
import com.magento.idea.magento2plugin.magento.files.ModuleMenuXml;
1617
import com.magento.idea.magento2plugin.magento.files.UiComponentXml;
1718
// CHECKSTYLE IGNORE check FOR NEXT 5 LINES
@@ -387,7 +388,7 @@ public void registerReferenceProviders(@NotNull PsiReferenceRegistrar registrar)
387388
XmlPatterns.xmlAttribute().withName("disabled")
388389
)
389390
)
390-
).inFile(xmlFile().withName(string().endsWith("di.xml"))),
391+
).inFile(xmlFile().withName(string().matches(ModuleDiXml.FILE_NAME))),
391392
new PluginReferenceProvider()
392393
);
393394

0 commit comments

Comments
 (0)