From 617cf732e4d482c8b9efd4e50f28c22a991a1ae3 Mon Sep 17 00:00:00 2001 From: Yaroslav Pankratyev Date: Fri, 17 Aug 2018 17:35:21 +0700 Subject: [PATCH] IDEA-196400 References for themeProvider@path attribute --- .../devkit-core/resources/META-INF/plugin.xml | 1 + .../ThemePathReferenceContributor.java | 45 +++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 plugins/devkit/devkit-core/src/references/ThemePathReferenceContributor.java diff --git a/plugins/devkit/devkit-core/resources/META-INF/plugin.xml b/plugins/devkit/devkit-core/resources/META-INF/plugin.xml index 605648328141..8041447e4a49 100644 --- a/plugins/devkit/devkit-core/resources/META-INF/plugin.xml +++ b/plugins/devkit/devkit-core/resources/META-INF/plugin.xml @@ -194,6 +194,7 @@ + diff --git a/plugins/devkit/devkit-core/src/references/ThemePathReferenceContributor.java b/plugins/devkit/devkit-core/src/references/ThemePathReferenceContributor.java new file mode 100644 index 000000000000..7c0319611b5a --- /dev/null +++ b/plugins/devkit/devkit-core/src/references/ThemePathReferenceContributor.java @@ -0,0 +1,45 @@ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package org.jetbrains.idea.devkit.references; + +import com.intellij.ide.ui.UIThemeProvider; +import com.intellij.patterns.XmlAttributeValuePattern; +import com.intellij.patterns.XmlPatterns; +import com.intellij.psi.*; +import com.intellij.psi.impl.source.resolve.reference.impl.providers.FileReferenceSet; +import com.intellij.psi.xml.XmlAttribute; +import com.intellij.psi.xml.XmlTag; +import com.intellij.util.ProcessingContext; +import com.intellij.util.xml.DomElement; +import com.intellij.util.xml.DomManager; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.idea.devkit.dom.Extension; +import org.jetbrains.idea.devkit.dom.ExtensionPoint; +import org.jetbrains.idea.devkit.util.PsiUtil; + +public class ThemePathReferenceContributor extends PsiReferenceContributor { + @Override + public void registerReferenceProviders(@NotNull PsiReferenceRegistrar registrar) { + registrar.registerReferenceProvider(getPattern(), new PsiReferenceProvider() { + @NotNull + @Override + public PsiReference[] getReferencesByElement(@NotNull PsiElement element, @NotNull ProcessingContext context) { + if (!PsiUtil.isPluginXmlPsiElement(element)) return PsiReference.EMPTY_ARRAY; + + XmlTag tag = ((XmlAttribute)element.getParent()).getParent(); + DomElement domElement = DomManager.getDomManager(element.getProject()).getDomElement(tag); + if (!(domElement instanceof Extension)) return PsiReference.EMPTY_ARRAY; + + ExtensionPoint extensionPoint = ((Extension)domElement).getExtensionPoint(); + if (extensionPoint == null) return PsiReference.EMPTY_ARRAY; + if (!UIThemeProvider.EP_NAME.getName().equals(extensionPoint.getEffectiveQualifiedName())) return PsiReference.EMPTY_ARRAY; + + return new FileReferenceSet(element).getAllReferences(); + } + }); + } + + + private static XmlAttributeValuePattern getPattern() { + return XmlPatterns.xmlAttributeValue().withLocalName("path"); + } +}