From b066b901b7b70388bca293193bbce4cd34430f6b Mon Sep 17 00:00:00 2001 From: bohdan-harniuk Date: Wed, 29 Sep 2021 18:08:27 +0300 Subject: [PATCH] Bug-663: Fixed NullPointerException for PluginReferenceProvider --- .../provider/PluginReferenceProvider.java | 52 +++++++++++++++---- .../xml/XmlReferenceContributor.java | 5 +- 2 files changed, 46 insertions(+), 11 deletions(-) diff --git a/src/com/magento/idea/magento2plugin/reference/provider/PluginReferenceProvider.java b/src/com/magento/idea/magento2plugin/reference/provider/PluginReferenceProvider.java index ae1be9ec1..0b9135068 100644 --- a/src/com/magento/idea/magento2plugin/reference/provider/PluginReferenceProvider.java +++ b/src/com/magento/idea/magento2plugin/reference/provider/PluginReferenceProvider.java @@ -1,4 +1,4 @@ -/** +/* * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ @@ -16,6 +16,7 @@ import com.intellij.psi.xml.XmlTag; import com.intellij.util.ProcessingContext; import com.magento.idea.magento2plugin.indexes.PluginIndex; +import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; import com.magento.idea.magento2plugin.reference.xml.PolyVariantReferenceBase; import java.util.ArrayList; import java.util.Collection; @@ -23,19 +24,45 @@ import org.jetbrains.annotations.NotNull; public class PluginReferenceProvider extends PsiReferenceProvider { + + @SuppressWarnings({ + "PMD.CognitiveComplexity", + "PMD.CyclomaticComplexity", + "PMD.NPathComplexity" + }) @Override public @NotNull PsiReference[] getReferencesByElement( - @NotNull final PsiElement element, - @NotNull final ProcessingContext context + final @NotNull PsiElement element, + final @NotNull ProcessingContext context ) { - final List psiReferences = new ArrayList<>(); - final Project project = element.getProject(); - final List psiElements = new ArrayList<>(); + if (!(element.getParent() instanceof XmlAttribute) + || !ModuleDiXml.NAME_ATTR.equals(((XmlAttribute) element.getParent()).getName()) + || !(element.getParent().getParent() instanceof XmlTag) + || !ModuleDiXml.PLUGIN_TAG_NAME.equals( + ((XmlTag) element.getParent().getParent()).getName()) + ) { + return PsiReference.EMPTY_ARRAY; + } final XmlTag originalPluginTag = (XmlTag) element.getParent().getParent(); final XmlTag originalTypeTag = originalPluginTag.getParentTag(); - final String originalPluginName = originalPluginTag.getAttribute("name").getValue(); - final String originalTypeName = originalTypeTag.getAttribute("name").getValue(); + + if (originalTypeTag == null || !ModuleDiXml.TYPE_TAG.equals(originalTypeTag.getName())) { + return PsiReference.EMPTY_ARRAY; + } + final XmlAttribute originalPluginNameAttr = originalPluginTag.getAttribute("name"); + final XmlAttribute originalTypeNameAttr = originalTypeTag.getAttribute("name"); + + if (originalPluginNameAttr == null || originalTypeNameAttr == null) { + return PsiReference.EMPTY_ARRAY; + } + final String originalPluginName = originalPluginNameAttr.getValue(); + final String originalTypeName = originalTypeNameAttr.getValue(); + + if (originalPluginName == null || originalTypeName == null) { + return PsiReference.EMPTY_ARRAY; + } + final Project project = element.getProject(); final Collection types = PluginIndex.getInstance(project).getPluginElements( originalTypeName, @@ -43,22 +70,29 @@ public class PluginReferenceProvider extends PsiReferenceProvider { GlobalSearchScope.allScope(project), XmlFileType.INSTANCE ) ); + final List psiElements = new ArrayList<>(); for (final PsiElement type: types) { final XmlTag typeTag = (XmlTag) type.getParent().getParent(); final XmlTag[] pluginTags = typeTag.findSubTags("plugin"); + for (final XmlTag pluginTag: pluginTags) { final XmlAttribute pluginNameAttribute = pluginTag.getAttribute("name"); - if (pluginNameAttribute.getValue().equals(originalPluginName)) { + + if (pluginNameAttribute != null + && pluginNameAttribute.getValue() != null + && originalPluginName.equals(pluginNameAttribute.getValue())) { psiElements.add(pluginNameAttribute.getValueElement()); } } } + final List psiReferences = new ArrayList<>(); if (!psiElements.isEmpty()) { final int startIndex = element.getText().indexOf(originalPluginName); final int endIndex = startIndex + originalPluginName.length(); final TextRange range = new TextRange(startIndex, endIndex); + psiReferences.add(new PolyVariantReferenceBase(element, range, psiElements)); } diff --git a/src/com/magento/idea/magento2plugin/reference/xml/XmlReferenceContributor.java b/src/com/magento/idea/magento2plugin/reference/xml/XmlReferenceContributor.java index e1eb7471a..3b1016eee 100644 --- a/src/com/magento/idea/magento2plugin/reference/xml/XmlReferenceContributor.java +++ b/src/com/magento/idea/magento2plugin/reference/xml/XmlReferenceContributor.java @@ -1,4 +1,4 @@ -/** +/* * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ @@ -12,6 +12,7 @@ import com.magento.idea.magento2plugin.magento.files.MftfActionGroup; import com.magento.idea.magento2plugin.magento.files.MftfTest; import com.magento.idea.magento2plugin.magento.files.ModuleDbSchemaXml; +import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; import com.magento.idea.magento2plugin.magento.files.ModuleMenuXml; import com.magento.idea.magento2plugin.magento.files.UiComponentXml; // CHECKSTYLE IGNORE check FOR NEXT 5 LINES @@ -387,7 +388,7 @@ public void registerReferenceProviders(@NotNull PsiReferenceRegistrar registrar) XmlPatterns.xmlAttribute().withName("disabled") ) ) - ).inFile(xmlFile().withName(string().endsWith("di.xml"))), + ).inFile(xmlFile().withName(string().matches(ModuleDiXml.FILE_NAME))), new PluginReferenceProvider() );